文章目录
四大主键生成策略
identity
主键自增策略:
- MySQL推荐使用策略 但是真实开发过程中基本不用 因为兼容性太差
- 多数数据库支持MySQL, SQL Server, DB2, Derby, Sybase, PostgreSQL。 但是oracle不支持
sequence
类似主键自增:
- Oracle推荐使用策略 真实开发基本不用 兼容性差
- 支持的数据库: Oracle、PostgreSQL、DB2
auto
JPA默认的策略
- 真实开发推荐
- 它会根据你当前使用的方言来确定,应该是使用identity还是sequence策略
teble
- 了解 真实开发不用
- 优点:兼容性超级好
- 缺点:性能超级差
sequence策略
sequence策略其实就是把主键封装成一个表的结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7zQ7yCGd-1579188183081)(mdjs\img\sequence策略.png)]
JPA的状态
为什么要学习jpa的状态
在jpa中的细节很多,如果不学习jpa状态,那么在jpa中很多细节解释不了,我们要了解jpa 必须要学jpa状态
JPA的四大状态
1. 临时状态/瞬时状态
该对象被new出来之后,还没有交给entityManager管理,现在这个对象的状态就叫做临时状态
2. 持久化状态/托管状态
该对象已经和entityManager发生了关系,该对象此时的状态就叫做持久化状态(特点:此时对象必有主键id)
3. 游离状态/脱管状态
管理该对象的entityManager已经关闭 ,该对象没有被entityManager所管理,该对象此时的状态就叫游离状态
4. 删除状态
该对象已经被remove后,此时该对象就处于删除状态
hibernate只有三种状态
- 临时状态/瞬时状态
- 持久化状态/托管状态
- 游离状态/脱管状态
merge的总结
在临时状态下:
当有id的时候:
- merge查询数据
- 有对象:
- 有脏数据—更新
- 没有脏数据—不进行任何操作(该对象不是持久化对象)
- 没有对象:
- 插入数据
- 有对象:
没有id的时候
- 插入数据
@Test
public void test1(){
EntityManager entityManager = JPAUtil.openEntityManager();
entityManager.getTransaction().begin();
Statement statement = new Statement();
statement.setName("leryoo"); //此时的domain还没有交给entityManager管理 还是临时状态
//Statement statement = entityManager.find(Statement.class, 1L);这种情况也算是交给entityManager管理
entityManager.persist(statement);
System.out.println(statement);//此时的domain已经和EntityManager发生了关系 已经是持久化
entityManager.getTransaction().commit();
entityManager.close();
System.out.println(statement);//此时domain已经脱离了EntityManager的管理 就是游离状态
}
临时状态对象的数据修改的执行过程
脏数据更新
当提交的时候,持久化对象和快照进行比较,比较不相等,则发送更新sql语句,这种效果我们就叫做脏数据更新
JPA状态的改变
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AZjEbTiV-1579188183085)(mdjs\img\JPA状态的改变图.png)]
关系映射
关系认识
-
依赖关系
ex:Controller依赖service层 Service层依赖Dao层 -
关联关系
- 多对一(最常用)
- 一对多
- 一对一
- 多对多
关系映射
导航性
- 单向
- 从A方能找到B方,从B方不能找到A方
- 双向
- 不管从哪方都能找到对方
注意:不管关联关系是单向还是双向的。在数据库中表的结构是一模一样的,因为在数据表中是不分单向和双向的
小技巧:
怎么判断对象中是写对象还是集合呢?
对象都是1 集合都是多
表的设计:
外键永远都是在多方
注意:保存的时候一定要先保存一的一方再保存多的一方
domain的注解
@ManyToOne(fetch = FetchType.LAZY)
fetche抓取策略:
- fetch =FetchType.LAZY 懒加载
- fetch =FetchType.EAGER 迫切加载 如果你不配置,默认就是此值
懒加载:当从数据库取数据的时候,只会加载相关的表
@JoinColumn(name = "dir_id")
- 当你只写了many2one之后,它自动产生的列名是 xxx_id
- 自定义外键的列名
JPA的缓存
什么是缓存
用空间换时间
优点:查询性能快
缺点:占用内存
1. 一级缓存
存在entityManager内部
一级缓存命中的条件:
- 同一个OID
- 同一个entityManager
- 同一个entityManagerFactory
2. 二级缓存
存在entityManagerFactory内部
二级缓存命中的条件
- 同一个OID
- 同一个entityManagerFactory
哪些场景适用缓存
- 数据的读取大于修改
- 对数据要有独享控制,数据不会被第三方修改
- 可以容忍出现无效数据,非关键数据(不是财务数据)
- 数据量不能超过内存容量,数据量特别巨大。就不是二级缓存