jpa2总结

1. JPA的主键生成策略

主键分类:

代理主键 :没有实际意义的一些列作为主键 比如id 现在就用的代理主键

自然主键 :把具有业务含义的字段作为主键叫做自然主键,此字段必须唯一,因为主键必须唯一

JPA通用策略生成器 
通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 
其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法, 
JPA提供四种标准用法,由@GeneratedValue的源代码可以明显看出.

JPA提供了四种主键生成策略

  1. IDENTITY:ID自增长策略。只能用于支持ID自增长的数据库。
  2. SEQUENCE:序列生成策略。指定使用SEQUENCE策略。和HIbernate的xml一样。如果在MySQL里面使用一个表模拟序列,如果使用在Oracle里面直接使用序列
  3. TABLE策略,不管什么数据库,都是使用一个表来模拟序列
    因为每创建一个表就会生成另一个序列表 太麻烦了
  4. AUTO:由框架决定根据不同的数据库指定一个策略。

 

2 JPA的实体状态

临时状态:对象在保存进数据库之前为临时状态。此时数据库中没有该对象的信息,该对象的ID属性也为空。如果没有被持久化,程序退出时临时状态的对象信息将丢失。

持久化状态:对象在保存进数据库后或者从数据库中加载后、并且没有脱离Session时为持久化状态。这时候数据库中有对象的信息,改对象的id为数据库中对应记录的主键值。由于还在Session中,持久化状态的对象可以执行任何有关数据库的操作,例如获取集合属性的值等。

分离状态:是对象曾经处于持久化状态、但是现在已经离开Session了。虽然分离状态的对象有id值,有对应的数据库记录,但是已经无法执行有关数据库的操作。例如,读取延迟加载的集合属性,可能会抛出延迟加载异常。

删除状态

如果我们要删除一个内容 remove 这个对象的状态就是删除状态

3.脏数据更新

作用:持久化对象,一旦修改,事务提交的时候也会自动修改
1、没有执行meger,也能完成修改
2、加了meger,内容没有改变,方法也没有执行
执行流程分析:
第一步:拿到entityManager,开启事务
第二步:
通过entityManager拿到一个对象,那么现在这个对象就是持久化的对象
这个对象会放到一级缓存里面
JPA会为当前这个对象准备一个快照(把这个对象进行了备份)
第三步:提交事务
它会把快照 与 你现在这个对象的数据进行对比
如果相同,就不需要修改,也不会发送SQL(性能就高了)
当不相同的时候,JPA就会认为现在这个数据是脏数据
脏数据它就会在事务提交的时候,把它进行数据库的同步(发送update SQL语句)

4.实体之间关系

jpa2总结_第1张图片

4 查询-抓取策略

抓取策略就是告诉JPA怎样发出sql获取关联对象

FetchType.EAGER:fetch的默认值,立即加载

默认情况下,JPA持续性提供程序使用获取类型EAGER:这将要求持续性提供程序运行时必须迫切左外连接获取数据。

FetchType.LAZY:延迟加载

FetchType.LAZY:这将提示持续性提供程序在首次访问数据时并不急于获取

5.二级缓存

1.一级缓存:同一个EntityManager不用重复从数据库中查询同一个数据

2.二级缓存:命中条件:同一个EntityManagerFactory,不同的EntityManager,同一个OID

开启条件
1.导入jar包

2.在pesistence.xml中完成配置

3.在实体类中加上@Cacheable

4.测试

适用场景
1.查询多于增删改
2.财务金融等敏感数据不适合
3.数据量太大不适合
4.数据库被多方系统增删改不适合

 

什么时候 可以使用二级缓存

1.读取大于修改(查询居多 修改很少)

如果经常修改数据,缓存里面数据也需要修改 ,也要同步

2.你要对数据 有独享控制,不能被第三方程序改变,不然数据就会出现脏数据

3.这个数据必须能够容忍一些错误,太精确的数据不适合放入缓存(金额)

日志信息

4.缓存数据量不要超过内存容器,超过不能存下来,但是有NB框架,实现==钝化==的效果

内存数据量满了之后,会存入磁盘 -- ehcahe

缓存命中条件

一级命中条件: --底层自动会用 不用做任何配置

同一个EntityManagerFactory 同一个EntityManager 同一个OID

二级缓存命中: 需要开启二级缓存 做配置 -- 选择 同一个EntityManagerFactory 不同的EntityManager 同一个OID

查询缓存命中条件:

同一个EntityManagerFactory 不同的EntityManager 发出jpql语句相同,条件值相同 -- 用的很少,

条件值相同情况下 很少,命中很低

你可能感兴趣的:(jpa2总结)