主键分类:
代理主键 :没有实际意义的一些列作为主键 比如id 现在就用的代理主键
自然主键 :把具有业务含义的字段作为主键叫做自然主键,此字段必须唯一,因为主键必须唯一
JPA通用策略生成器
通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id,
其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法,
JPA提供四种标准用法,由@GeneratedValue的源代码可以明显看出.
JPA提供了四种主键生成策略
临时状态:对象在保存进数据库之前为临时状态。此时数据库中没有该对象的信息,该对象的ID属性也为空。如果没有被持久化,程序退出时临时状态的对象信息将丢失。
持久化状态:对象在保存进数据库后或者从数据库中加载后、并且没有脱离Session时为持久化状态。这时候数据库中有对象的信息,改对象的id为数据库中对应记录的主键值。由于还在Session中,持久化状态的对象可以执行任何有关数据库的操作,例如获取集合属性的值等。
分离状态:是对象曾经处于持久化状态、但是现在已经离开Session了。虽然分离状态的对象有id值,有对应的数据库记录,但是已经无法执行有关数据库的操作。例如,读取延迟加载的集合属性,可能会抛出延迟加载异常。
删除状态
如果我们要删除一个内容 remove 这个对象的状态就是删除状态
作用:持久化对象,一旦修改,事务提交的时候也会自动修改
1、没有执行meger,也能完成修改
2、加了meger,内容没有改变,方法也没有执行
执行流程分析:
第一步:拿到entityManager,开启事务
第二步:
通过entityManager拿到一个对象,那么现在这个对象就是持久化的对象
这个对象会放到一级缓存里面
JPA会为当前这个对象准备一个快照(把这个对象进行了备份)
第三步:提交事务
它会把快照 与 你现在这个对象的数据进行对比
如果相同,就不需要修改,也不会发送SQL(性能就高了)
当不相同的时候,JPA就会认为现在这个数据是脏数据
脏数据它就会在事务提交的时候,把它进行数据库的同步(发送update SQL语句)
抓取策略就是告诉JPA怎样发出sql获取关联对象
FetchType.EAGER:fetch的默认值,立即加载
默认情况下,JPA持续性提供程序使用获取类型EAGER:这将要求持续性提供程序运行时必须迫切左外连接获取数据。
FetchType.LAZY:延迟加载
FetchType.LAZY:这将提示持续性提供程序在首次访问数据时并不急于获取
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语句相同,条件值相同 -- 用的很少,
条件值相同情况下 很少,命中很低