持久层、ORM、Persistence、POJO类、主键策略、DDL策略、一级缓存、Session、快照、hibernate状态、映射关系、cascade级联、inverse、查询方式、检索策略、二级缓存、事务级别
https://www.cnblogs.com/whgk/category/910622.html


Jpa、Hibernate、Spring Data Jpa三者之间的关系

参考: https://blog.csdn.net/u014421556/article/details/52635000
Hibernate - 图1

JPA ORM规范
Hibernate ORM框架 - JPA规范的一种实施框架
Spring Data JPA 它在JPA的基础上添加了另一层抽象,定义了一种基于标准的设计,以支持Spring上下文中的持久性层,大大减少为各种持久性存储实现数据访问层的工作量

一级缓存与三种状态

session

每次hibernate跟数据库打交道时,都是通过session来对要操作的对象取得关联,然后在进行操作。

首先session将一个对象加入自己的管理范围内,其实也就是把该对象放入自己的一级缓存中,例如,session.save(xxx);这个语句就是将xxx保存在自己的一级缓存中,等待事务提交后,hibernate才真正的发sql语句,对数据库进行操作。注意:session进行操作的时候,是将对象加入自己的一级缓存,并不是就直接跟数据库打交道了。

一级缓存与快照

image.png
在session将实体对象加入一级缓存时,一级缓存和快照区都是一样的,当实体对象改变自己的属性时,此时将快照区中的实体对象的属性改变了,
在事务提交时,会发送insert插入语句,因为使用了session的save语句,将一级缓存中的数据增加到数据库,然后在通过快照区和一级缓存做对比,如果不一样的地方,那么就会在发送一个update语句进行更新,(注意,除了id属性外,其他属性改变会发送update语句,id属性改变,就会报异常。)
Hibernate - 图3
Hibernate - 图4

三种状态

瞬时状态transient、持久状态(托管)persistent、游离(脱管)detached状态

Hibernate - 图5
Hibernate - 图6

  1. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  2. session = HibernateUtil.openSession();
  3. session.beginTransaction();
  4. User u = new User();
  5. u.setBorn(new Date());
  6. u.setUsername("zhangsan");
  7. u.setPassword("zhangsan");
  8. session.save(u);
  9. u.setPassword("222");
  10. //该条语句没有意义
  11. session.save(u);
  12. u.setPassword("zhangsan111");
  13. //没有意义
  14. session.update(u);
  15. u.setBorn(sdf.parse("1988-12-22"));
  16. //没有意义
  17. session.update(u);
  18. session.getTransaction().commit();
  19. =====================================
  20. Hibernate: insert into t_user (born, password, username) values (?, ?, ?)
  21. Hibernate: update t_user set born=?, password=?, username=? where id=?

二级缓存

一级缓存存Session, 二级缓存存Session共享内容-eg查询结果

事务隔离问题

事务隔离问题: 脏读、不可重复读、幻读三者的含义与区别,以及丢失更新问题

Hibernate与JPA级联操作的区别

  • Hibernate支持所有JPA级联类型和一些其他旧式级联样式。
  • 在JPA EntityManager或Hibernate Session上调用persistmergerefresh没有什么区别。
  • JPA的removedetach调用被委托给Hibernate Delete逐出本机操作。
  • 只有Hibernate支持复制saveOrUpdate 。 尽管复制对于某些非常特定的场景很有用(当确切的实体状态需要在两个不同的数据源之间进行镜像时),但持久 合并合并始终是比本机saveOrUpdate操作更好的替代方法。将持久性用于TRANSIENT实体,将其用于已分离的实体。saveOrUpdate的缺点(将分离的实体快照传递给已经管理该实体的Session时 )导致了合并操作的前身:现已不存在的saveOrUpdateCopy操作。
  • JPA锁定方法与Hibernate锁定请求方法具有相同的行为。
  • JPA CascadeType.ALL不仅适用于EntityManager状态更改操作,而且还适用于所有Hibernate CascadeTypes 。因此,如果将关联与CascadeType.ALL映射,您仍然可以级联Hibernate特定事件。 例如,即使JPA没有定义LOCK CascadeType ,您也可以级联JPA锁定操作(尽管它表现为重新附加,而不是实际的锁定请求传播)。
  • https://blog.csdn.net/dnc8371/article/details/106703789