持久层、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
JPA | ORM规范 |
---|---|
Hibernate | ORM框架 - JPA规范的一种实施框架 |
Spring Data JPA | 它在JPA的基础上添加了另一层抽象,定义了一种基于标准的设计,以支持Spring上下文中的持久性层,大大减少为各种持久性存储实现数据访问层的工作量 |
一级缓存与三种状态
session
每次hibernate跟数据库打交道时,都是通过session来对要操作的对象取得关联,然后在进行操作。
首先session将一个对象加入自己的管理范围内,其实也就是把该对象放入自己的一级缓存中,例如,session.save(xxx);这个语句就是将xxx保存在自己的一级缓存中,等待事务提交后,hibernate才真正的发sql语句,对数据库进行操作。注意:session进行操作的时候,是将对象加入自己的一级缓存,并不是就直接跟数据库打交道了。
一级缓存与快照
在session将实体对象加入一级缓存时,一级缓存和快照区都是一样的,当实体对象改变自己的属性时,此时将快照区中的实体对象的属性改变了,
在事务提交时,会发送insert插入语句,因为使用了session的save语句,将一级缓存中的数据增加到数据库,然后在通过快照区和一级缓存做对比,如果不一样的地方,那么就会在发送一个update语句进行更新,(注意,除了id属性外,其他属性改变会发送update语句,id属性改变,就会报异常。)
三种状态
瞬时状态transient、持久状态(托管)persistent、游离(脱管)detached状态
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
session = HibernateUtil.openSession();
session.beginTransaction();
User u = new User();
u.setBorn(new Date());
u.setUsername("zhangsan");
u.setPassword("zhangsan");
session.save(u);
u.setPassword("222");
//该条语句没有意义
session.save(u);
u.setPassword("zhangsan111");
//没有意义
session.update(u);
u.setBorn(sdf.parse("1988-12-22"));
//没有意义
session.update(u);
session.getTransaction().commit();
=====================================
Hibernate: insert into t_user (born, password, username) values (?, ?, ?)
Hibernate: update t_user set born=?, password=?, username=? where id=?
二级缓存
一级缓存存Session, 二级缓存存Session共享内容-eg查询结果
事务隔离问题
事务隔离问题: 脏读、不可重复读、幻读三者的含义与区别,以及丢失更新问题
Hibernate与JPA级联操作的区别
- Hibernate支持所有JPA级联类型和一些其他旧式级联样式。
- 在JPA EntityManager或Hibernate Session上调用persist , merge或refresh没有什么区别。
- JPA的remove和detach调用被委托给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