JPA之Hibernate
JPA
定义:是 JavaEE 中一组用于持久化数据的 API,它提供了一种标准的 ORM 规范,用于 Java 对象映射到数据库中。
JPA 的开发是为了简化企业级应用程序的开发,降低应用程序与数据库之间的耦合度,并提高应用程序的可维护性和可扩展性。
JPA 定义了一系列注解和接口,用于描述 Java 对象与数据库表之间的映射关系。其中,最重要的是实体类(Entity)和实体管理器(EntityManager)。
注意:JPA 只是一种规范,具体的实现由不同的厂商提供,比如 Hibernate、EclipseLink 等。因此,在使用 JPA 时,需要选择一个合适的实现,并按照其提供的文档进行配置和使用。
Interview & Answer
什么是 JPA?它的作用是什么?
JPA(Java Persistence API)是 JavaEE 中一组用于持久化数据的 API,它提供了一种标准的 ORM(对象关系映射)规范,用于将 Java 对象映射到关系型数据库中。JPA 的作用是简化企业级应用程序的开发,降低应用程序与数据库之间的耦合度,并提高应用程序的可维护性和可扩展性。
JPA 中的实体类是什么?如何定义实体类?
实体类是一个普通的 Java 类,用于表示数据库中的一张表。在实体类中,使用注解来描述类与表之间的映射关系,比如 @Entity、@Table、@Id 等。实体类通常包含一组属性(属性对应表中的列),以及一些方法(用于操作这些属性)。
JPA 提供了哪些 API 接口?分别有什么作用?
JPA 提供了一些 API 接口,包括 EntityManager、EntityTransaction、Query 等,这些接口可以用来操作 Java 对象和数据库之间的映射关系。EntityManager 用于管理实体对象,EntityTransaction 用于管理事务,Query 用于执行查询操作。
JPA 中的实体管理器是什么?如何使用它来操作实体对象?
实体管理器是用于管理实体对象的类,它提供了一系列方法,用于对实体对象进行增删改查等操作。在 JPA 中,实体管理器是通过 EntityManagerFactory 创建的,每个应用程序通常只需要一个 EntityManagerFactory 实例,但可以创建多个 EntityManager 实例。可以通过调用 EntityManager 的方法来对实体对象进行操作,比如 persist、remove、merge、find 等方法。
JPA 中的注解有哪些?它们的作用是什么?
JPA 中的注解包括 @Entity、@Table、@Id、@Column 等,用于描述 Java 对象与数据库表之间的映射关系。其中,@Entity 用于指定一个 Java 类为实体类,@Table 用于指定实体类对应的数据库表,@Id 用于指定实体类属性为主键,@Column 用于指定实体类属性与数据库表列之间的映射关系。
JPA 中的事务管理是如何实现的?如何配置事务管理器?
JPA 中的事务管理可以通过实体管理器的 getTransaction 方法来获取一个 EntityTransaction 实例,然后调用其 begin、commit、rollback 等方法来管理事务。在 Spring 框架中,可以使用 @Transactional 注解来配置事务管理器,通过在方法或类上添加该注解来实现事务管理。
JPA 中的缓存机制是如何实现的?什么是一级缓存和二级缓存?
JPA 中的缓存机制包括一级缓存和二级缓存。一级缓存是指实体管理器与数据库之间的缓存,它是默认开启的,可以通过 EntityManager 的 clear、refresh 等方法来操作。二级缓存是指在多个实体管理器之间共享的缓存,它需要通过配置文件来启用,并且需要使用 JPA 提供商提供的缓存实现。二级缓存可以减少数据库访问次数,提高应用程序的性能。
JPA 中的 JPQL 是什么?如何使用 JPQL 进行查询操作?
JPQL(Java Persistence Query Language)是一种面向对象的查询语言,用于查询实体对象。JPQL 与 SQL 语句类似,但是它是面向对象的,可以直接引用实体类和实体类属性。JPQL 可以使用 EntityManager 的 createQuery 方法来创建查询对象,然后使用查询对象的 setParameters、getResultList 等方法来执行查询操作。
JPA 的实现有哪些?它们之间有什么区别?
JPA 的实现有很多,比较常见的有 Hibernate、EclipseLink、OpenJPA 等。这些实现都遵循 JPA 规范,但是在实现上有些许差异,比如性能、功能、稳定性等方面。开发人员可以根据自己的需求选择合适的实现。
JPA 和 Hibernate 之间有什么关系?它们之间有什么区别?
JPA 是一种规范,而 Hibernate 是实现了 JPA 规范的 ORM 框架。Hibernate 可以看作是 JPA 的一种实现,它实现了 JPA 规范,并提供了一些 JPA 规范之外的功能,比如缓存、批量操作、动态查询等。但是,使用 Hibernate 并不一定要遵循 JPA 规范,开发人员可以直接使用 Hibernate 提供的 API 来操作数据库。
JPA 实现方式及缓存默认状态
JPA规范并没有指定一级和二级缓存的默认状态,这取决于具体的JPA实现和配置。下面是常见的JPA实现的默认缓存状态:
-
Hibernate:Hibernate是一个常用的JPA实现,它的一级缓存(Session级别的缓存)默认是开启的,而二级缓存(应用程序级别的缓存)默认是关闭的。可以通过配置文件或者代码的方式来开启或关闭二级缓存。
-
EclipseLink:EclipseLink是另一个常用的JPA实现,它的一级缓存(EntityManager级别的缓存)默认是开启的,而二级缓存(应用程序级别的缓存)默认是关闭的。可以通过配置文件或者代码的方式来开启或关闭二级缓存。
-
OpenJPA:OpenJPA是另一个流行的JPA实现,它的一级缓存(EntityManager级别的缓存)默认是开启的,而二级缓存(应用程序级别的缓存)默认是关闭的。可以通过配置文件或者代码的方式来开启或关闭二级缓存。
如何理解都默认开一级缓存
有点类似都在一个事务中,这要求可重复读等,所以都要开启
JPA 注解使用 demo
// 查询@Query(value = "SELECT * FROM user WHERE name = :name", nativeQuery = true)List<User> findByName(@Param("name") String name);// 修改@Modifying@Query(value = "UPDATE user SET age = :age WHERE id = :id", nativeQuery = true)void updateAgeById(@Param("id") Long id, @Param("age") Integer age);// 删除@Modifying@Query(value = "DELETE FROM user WHERE id = :id", nativeQuery = true)void deleteById(@Param("id") Long id);// list 入参@Query("SELECT u FROM User u WHERE u.name IN :names")List<User> findByNames(@Param("names") List<String> names);// map 入参// 在这个示例中,我们定义了一个自定义查询方法findByCondition,使用@Query注解指定了JPQL查询语句。查询语句中使用了实体类User和其属性name、age,使用AND关键字指定查找name属性等于condition中的"name"键对应的值,age属性大于等于condition中的"minAge"键对应的值的用户信息// 使用Map作为查询条件时,需要注意的是,Map中的键必须与JPQL查询语句中的参数名一致,否则会抛出异常。@Query("SELECT u FROM User u WHERE u.name = :name AND u.age >= :minAge")List<User> findByCondition(@Param("condition") Map<String, Object> condition);// 复杂对象入参// @Query("SELECT u FROM User u WHERE u.name = :#{#query.name} AND u.age >= :#{#query.minAge}")// List<User> findByCondition(@Param("query") UserQuery query);////public class UserQuery {// private String name;// private Integer minAge;// // 省略getter和setter方法//}// 联表查询// @Query("SELECT o FROM Order o JOIN o.user u WHERE u.name = :name")// List<Order> findByUserName(@Param("name") String name);// null 不更新@Query("UPDATE TP_USER_ACTIVITY_LOG \n" +"SET IF :name IS NOT NULL THEN name = :name END IF\n" +",age = :age\n" +"WHERE LOG_DATE = :logDate")Integer updateTest(@Param("name") String name, @Param("age") String age, @Param("logDate") Date logDate);// 关键在于数据库if 语句使用,不同数据库if的用法有所不同,所以,没有通用性// where 条件 为 null // 如果为空时显示1=1 代表参数为真,对查询结果不产生作用。// "WHERE IF (:byname is not null, c.byname LIKE CONCAT('%',:byname,'%') , 1 = 1) and IF (:isMember is not null, c.is_member = :isMember , 1 = 1) and IF (:isBlacklist is not null, c.is_blacklist = :isBlacklist , 1 = 1) and "// + "IF (:phone is not null, c.phone = :phone , 1 = 1)"
Hibernate
Hibernate 一级缓存
Hibernate 的一级缓存是 Session 级别的缓存,它默认是开启的,并且通常是不建议关闭的。但是,在某些特定的场景下,关闭一级缓存可能是有必要的,例如:
- 当需要强制刷新缓存,以避免缓存数据和数据库数据不一致时,可以考虑关闭一级缓存。
- 当需要避免缓存数据的过期或者内存溢出时,可以考虑关闭一级缓存。
- 当需要测试或者调试缓存相关的问题时,可以考虑关闭一级缓存。
关闭 Hibernate 的一级缓存有以下两种方式:
① 在 Session 中调用 clear() 方法:通过 Session 的 clear() 方法可以清空一级缓存中的所有数据。例如:
Session session = sessionFactory.openSession();session.beginTransaction();// 这里执行数据库操作,将数据写入数据库session.clear(); // 清空一级缓存// 这里再次执行数据库操作,从数据库中读取最新的数据
② 在 Hibernate 配置文件中设置缓存策略:通过在 Hibernate 配置文件(如 hibernate.cfg.xml)中设置缓存策略可以关闭一级缓存。例如:
<hibernate-configuration>
<session-factory><!-- ... --><property name="hibernate.cache.use_second_level_cache">false</property><property name="hibernate.cache.use_query_cache">false</property><!-- ... --></session-factory>
</hibernate-configuration>
在上述配置中,将 hibernate.cache.use_second_level_cache 和 hibernate.cache.use_query_cache 都设置为 false,可以关闭一级缓存和查询缓存。
注意:关闭一级缓存可能会导致性能下降和数据不一致等问题,因此在实际应用中需要慎重考虑是否关闭一级缓存。
Hibernate 一级缓存过期
Hibernate 的一级缓存是 Session 级别的缓存,它存储的是 Session 中查询的实体对象。一级缓存的过期时间是根据缓存中的对象状态和 Session 的状态来判断的。一级缓存的过期包括以下几种情况:
-
对象状态为持久化状态:当Session中的实体对象状态为持久化状态时,即该对象已经被保存到数据库中并且与数据库中的数据保持一致,那么该对象会一直保留在一级缓存中,直到Session关闭或者显式地从缓存中清除。
-
对象状态为游离状态:当Session中的实体对象状态为游离状态时,即该对象已经被从Session中分离出来,与数据库中的数据不再保持一致,那么该对象会失效并从一级缓存中移除。
-
对象状态为脱管状态:当Session中的实体对象状态为脱管状态时,即该对象已经被Session关闭或者从Session中分离出来,那么该对象会失效并从一级缓存中移除。
注意:一级缓存中的对象生命周期与 Session 的生命周期相关联。当 Session 关闭时,所有在一级缓存中的对象都会失效并从缓存中移除。因此,在使用 Hibernate 的过程中,需要根据具体的业务需求和场景来管理缓存,以避免数据的不一致和缓存的内存溢出等问题。
分布式 Hibernate 二级缓存一致性
在分布式系统中,由于存在多个应用程序实例和多个数据库实例,使用Hibernate的二级缓存可能会导致数据的不一致性问题。为了保持Hibernate的二级缓存一致性,可以采用以下几种方法:
-
配置缓存同步策略:通过配置缓存同步策略,可以保证多个应用程序实例之间的缓存数据一致性。例如,可以使用JGroups、ZooKeeper等工具来实现缓存同步和协调。
-
配置缓存失效策略:通过配置缓存失效策略,可以及时使缓存数据失效,避免缓存数据和数据库数据不一致。例如,可以使用时间戳、版本号等方式来实现缓存数据的失效和更新。
-
选择合适的二级缓存实现:不同的二级缓存实现具有不同的特点和优缺点,需要根据具体的业务需求和场景来选择合适的缓存实现。例如,Ehcache、Redis等缓存工具都是常用的二级缓存实现,它们都具有不同的特点和适用场景。
-
避免缓存数据过期:在使用Hibernate的二级缓存时,需要注意缓存数据的过期时间,避免缓存数据过期导致数据不一致。需要根据具体的业务需求和场景来设置缓存数据的过期时间,以保证数据的一致性和有效性。
注意:保持 Hibernate 的二级缓存一致性是一个复杂的问题,需要综合考虑多个因素和技术手段。在实际应用中,需要根据具体的业务需求和场景来选择合适的缓存策略和技术,以保证系统的性能和可靠性。
Springboot 接入 Hibernate
- maven 依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>${hibernate.version}</version>
</dependency>
- yaml 配置
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
- 创建 Entity
@Entity
@Table(name = "user")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "name")private String name;@Column(name = "age")private int age;// getters and setters
}
- 创建 Repository
public interface UserRepository extends JpaRepository<User, Long> {List<User> findByName(String name);
}
- 调用
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public List<User> findByName(String name) {return userRepository.findByName(name);}
}
相关文章:

JPA之Hibernate
JPA 定义:是 JavaEE 中一组用于持久化数据的 API,它提供了一种标准的 ORM 规范,用于 Java 对象映射到数据库中。 JPA 的开发是为了简化企业级应用程序的开发,降低应用程序与数据库之间的耦合度,并提高应用程序的可维护…...

leetcode(力扣)剑指 Offer 16. 数值的整数次方 (快速幂)
文章目录 题目描述思路分析完整代码 题目描述 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。 示例 1: 输入:x 2.00000, n 10 输出:10…...

git命令分类合集
配置 git config --global user.name <name>:设置全局用户名 git config --global user.email <email>:设置全局用户邮箱 git config --global core.editor <editor>:设置全局文本编辑器创建与克隆仓库 git init…...

微信小程序打开地图的方法
1、打开内置地图 wx.openLocation({latitude: 31.230416, // 上海的纬度longitude: 121.473701, // 上海的经度name: 上海市, // 地点名称address: 中国上海市黄浦区人民广场, // 地址的详细说明scale: 18, // 缩放比例success: function(res) {console.log(打开地图成功);},f…...

快手头部主播合体,二驴祁天道直播首秀销售额破亿
2023年刚刚过半,直播江湖突然生变。 快手头部娱乐主播「二驴」与快手户外主播第一人「祁天道」宣布“合体”,两者加总的粉丝量接近1亿,又一个“超级网红IP”诞生。 ▲图源:二驴的、祁天道快手截图 从白手起家的草根,…...

Golang Devops项目开发(1)
1.1 GO语言基础 1 初识Go语言 1.1.1 开发环境搭建 参考文档:《Windows Go语言环境搭建》 1.2.1 Go语言特性-垃圾回收 a. 内存自动回收,再也不需要开发人员管理内存 b. 开发人员专注业务实现,降低了心智负担 c. 只需要new分配内存,…...

Django系列之DRF简单使用
基于ModelViewSets的简单使用 models.py from django.db import modelsclass AuthorDetail(models.Model):gender models.CharField(max_length8)birthday models.DateField()telephone models.BigIntegerField()addr models.CharField(max_length64)class Author(models…...

新闻标题文本分类任务
目录 知识回顾使用debug调试 知识回顾 预处理内容 文本主要进行清洗、分词/分字 ID替换(不希望计算机看到文字,而是ID),通过语料表来表示,根据频率高低来分配ID号 文本的ID映射到文本的一个特征向量,进行词嵌入(Embedding)&…...

自己实现MyBatis 底层机制--抽丝剥茧(上)
😀前言 本篇博文是学习过程中的笔记和对于MyBatis底层机制的分析思路,希望能够给您带来帮助😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到…...

Django后端执行成功或失败状态码
后端执行成功或失败以状态码的形式告诉前端,处理成功返回200系列状态码,执行前端then里面的代码;处理失败返回400/500系列状态码,执行catch里面的代码。 200 OK :服务器成功返回用户请求的数据 201 CREATED ÿ…...

Prometheus中的关键设计
1、标准先行,注重生态 Prometheus 最重要的规范就是指标命名方式,数据格式简单易读。比如,对于应用层面的监控,可以要求必须具备这几个信息。 指标名称 metric Prometheus 内置建立的规范就是叫 metric(即 __name__…...

Centos7 安装yum
1、检查主机名和网络并且配置/etc/hosts文件 查看主机名:hostname 查看ip :ifconfig vi /etc/hosts//添加把主机名和IP配置进去hosts文件192.18.56.111 orcale12c2、关闭防火墙 systemctl status firewalld.service//检查防火墙状态 暂时关闭防火墙,下…...

无涯教程-Lua - 简介
Lua是一种轻量语言,它的官方版本只包括一个精简的核心和最基本的库。这使得Lua体积小、启动速度快。它用ANSI C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。和许多“大而全”的语言不一样,网络通信…...

【第一阶段】kotlin语言引用数据类型
Java语言中有两种数据类型 第一种:基本数据类型 如int double等 第二种:引用数据类型。如String kotlin只有一种数据类型,看起来都是引用数据类型,实际上编译器会在Java字节码中,修改成基本类型 //Java语言中有两种数…...

BUU [网鼎杯 2020 朱雀组]phpweb
BUU [网鼎杯 2020 朱雀组]phpweb 众生皆懒狗。打开题目,只有一个报错,不知何从下手。 翻译一下报错,data()函数:,还是没有头绪,中国有句古话说的好“遇事不决抓个包” 抓个包果然有东西,仔细一看这不就分别是函数和参…...

使用WebMvcConfigurationSupport后导致原来返回的json数据变为了xml的解决方法
问题 未使用WebMvcConfigurationSupport拦截时返回的数据都是JSON格式,使用WebMvcConfigurationSupport做拦截后数据的返回变为了XML的格式。 原因 在Spring框架中,WebMvcConfigurationSupport 是一个类,它可以用于自定义Spring MVC的配置…...

如何判断一个枚举值是否存在(Check if an Enum Value Exists in Java)
目录 Searching an Enum by NameSearching an Enum by ValueSearching an Enum by Integer ValueExceptions Thrown from Search Methods Searching an Enum by Name public enum Direction {EAST, WEST, SOUTH, NORTH;public static Direction findByName(String name) {Dire…...

网工内推 | 网络安全工程师,最高15K,有高温补贴
01 超圣信华 招聘岗位:网络安全工程师 职责描述: 1. 负责网络安全产品的售前沟通交流、现状调研、方案设计、产品测试、产品选型和招投标等工作。 2. 负责网络安全集成项目的实施管理、项目交付文档编制以及项目验收等工作。 3. 负责网络安全产品的售后…...

Android—ADB命令
文章目录 ADB常用命令 ADB常用命令 ADB常用命令如下: 方法描述adb help查看ADB命令帮助adb devices查看Android设备及端口号adb connect连接Android设备adb start-server开启服务adb kill-server关闭服务adb install ***.apk安装Android应用adb install -r ***.ap…...

音视频知识:MPEG-4、H264、MP4、AAC之间的关系
MPEG-4 一种编码标准。是国际标准化组织 (ISO) 主要针对消费类应用,已经针对运动图像压缩定义的标准。MPEG(Moving Picture Experts Group)标准包括 MPEG1、MPEG2与 MPEG4。 MPEG-4标准目前分为27个部分,统称为ISO/IEC14496国际标…...

智能门锁的无线通讯协议有哪些?主要特点是什么?
智能门锁的无线通讯协议主要有以下几种: Wi-Fi:Wi-Fi是一种基于无线局域网的无线通信协议,可以快速传输数据,并支持互联网连接。 ZigBee:ZigBee是一种低功耗、低成本的无线通信协议,适用于大量传感器和设…...

机器学习——异常检测
异常点检测(Outlier detection),⼜称为离群点检测,是找出与预期对象的⾏为差异较⼤的对象的⼀个检测过程。这些被检测出的对象被称为异常点或者离群点。异常点(outlier)是⼀个数据对象,它明显不同于其他的数据对象。异…...

小研究 - 一种复杂微服务系统异常行为分析与定位算法(一)
针对极端学生化偏差(Extreme Studentized &#…...

代码版本管理工具 git
1. 去B站看视频学习,只看前39集: 01-Git概述(Git历史)_哔哩哔哩_bilibili 2.学习Linux系统文本编辑器的使用 vi编辑器操作指令分享 (baidu.com) (13条消息) nano编辑器的使用_SudekiMing的博客-CSDN博客 windows下载安装Git官…...

【计算机视觉中的 GAN 】如何稳定GAN训练(3)
一、说明 在上一篇文章中,我们达到了理解未配对图像到图像翻译的地步。尽管如此,在实现自己的超酷深度GAN模型之前,您必须了解一些非常重要的概念。如本文所提的GAN模型新成员的引入:Wasserstein distance,boundary eq…...

一文讲清楚地图地理坐标系
前言 我最近在做一个和地图有关的项目,这里本人地图采用的是mapbox,其中涉及一个功能需要根据用户输入的地点直接定位到地图上的对应的位置,本人开始想的是直接调用百度的接口根据地名直接获取坐标,发现在地图上的位置有偏移不够…...

助力青少年科技创新人才培养,猿辅导投资1亿元设立新基金
近日,在日本千叶县举办的2023年第64届国际数学奥林匹克(IMO)竞赛公布比赛结果,中国队连续5年获得团体第一。奖牌榜显示,代表中国参赛的6名队员全部获得金牌。其中,猿辅导学员王淳稷、孙启傲分别以42分、39分…...

代码随想录算法训练营之JAVA|第十八天| 235. 二叉搜索树的最近公共祖先
今天是第 天刷leetcode,立个flag,打卡60天,如果做不到,完成一件评论区点赞最高的挑战。 算法挑战链接 235. 二叉搜索树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/descriptio…...

IO进程线程第五天(8.2)进程函数+XMind(守护进程(幽灵进程),输出一个时钟,终端输入quit时退出时钟)
1.守护进程(幽灵进程) #include<stdio.h> #include<head.h> int main(int argc, const char *argv[]) {pid_t cpid fork();if(0cpid){ //创建新的会话pid_t sidsetsid();printf("sid%d\n",sid);//修改运行目录为不可卸载的文件…...

物联网远程智能控制设备——开关量/正反转百分比控制
如今生产生活的便利性极大程度上得益于控制技术的发展,它改变了传统的工作模式,并将人们从【纯劳力】中解放出来。如今,随着科学技术的进步,控制器的种类及应用领域也越来越多。 物联网远程智能控制设备就是一种新型的、能够用于…...