jpa深入

  1. 主键的两种生成策略

    a)       主键:区分表里的没一行数据 特点:非空且唯一

    b)       JPA标准策略有4种:代理主键

                       i.            auto自动策略(MySQL数据库)、默认会根据配置文件中的方言策略来生成主键

                      ii.            table策略、额外创建一张表来维护主键

                     iii.            sequence序列化策略(只有orcale数据库才支持)、

                     iv.            identity策略;自增策略,MySQL常用的策略

      auto 和 identity的主键生成策略是一样的

      主键已经交给JPA维护了之后,就不能自己手动设置主键了

     @GeneratedValue方式默认是AUTO策略

     c)        余下的都是hibernate自己的策略,包括我们常用的native、uuid7n、assigned、sequence

  1. 代理主键和自然主键

    a)       代理主键:具有实际意义的列的主键

    b)       自然主键:没有实际意义的列来作为主键


  1. JPA持久对象的状态:一个实体交给JPA维护之后的一些状态

    a)       瞬时态:刚刚new出来,还没和entityManager对象发生关系

    b)       托管态(持久态):已和entityManager对象发生关系,持久态的数据不能修改主键如果改变主键值,会报n-n的错误

    c)        游离态:被持久化完毕,entityManager对象关闭资源的时候

    d)       删除态:只有调用了entityManager.delete(domain对象)方法

  1. 脏数据更新

    a)       会在查询一条数据时对其进行备份,如果有对数据非主键的数据进行修改,之后就会对备份的对象和现有对象进行对比,如果相同,就不发送SQL,不相同就重新发送SQL,属于脏数据更新
    如果entityManager对象调用了clear()方法,就会将缓存中的数据清除掉,就不会发生脏数据更新

  1. Domain层的定义规则

    a)       不能有final修饰(final修饰的类的懒加载会失效)

    b)       所有的属性类型必须是包装类型

    c)        必须含有无参构造方法

  1. Domain对象(域对象)之间的关系

    a)       依赖关系:Controller表现层依赖于Service业务层,Service依赖于Dao持久层

    b)       关联关系:注意关联关系的时候不要实例化,相当于没有主键
    (private ProductDir dir = new ProductDir();
    否则会报错()

                     i.            内容或者性质:一对一,一对多,多对一,多对多

        一对多:在持久化操作的时候,先保存一方在保存多方比先保存多方再保存一方的效率高(多发SQL语句),

                   ii.            导航性:单向或双向
    单向:只能从一方获取到另一方的数据
    双向:双方无论从哪一方都能获取另一方的数据

    c)        聚合关系(本质还是双向多对一和一对多)

    d)       组合关系(本质还是聚合关系,双向多对一和双向一对多)

    e)       一对多的时候要先保存一方在保存多方

  1. Fetch抓取策略

    a)       FetchType.EAGER:立即加载(急切的加载,会发关联表的SQL,有左外连接去查询数据)

    b)       FetchType.LAZY:懒加载(当需要用到关联表的数据时才会发送SQL),获取持久状态对象之后,还需要获取关联对象,此时才会真正发出sql,获取值,懒加载不能提前关闭entityManager,否    则会报错,使用懒加载的关联对象会在JPA管理下由代理模式生成一个代理对象

  1. 可以通过多方.get一方是否为null,来判断是否有外键的关联

  缓存的作用:牺牲空间换取时间
  缓存的底层是通过map集合来存储数据的,<key(oid) value(Employee)>

  1. 配置二级缓存方式一

    a)       先导入需要的jar包

    b)       在persistence.xml中的properties中配置缓存,在properties上面配置二级缓存扫描策略

    <!-- ALL:所有的实体类都被缓存 -->

    <!-- NONE:所有的实体类都不被缓存. -->

    <!-- ENABLE_SELECTIVE:标识 @Cacheable(true) 注解在实体类上将被缓存 -->

    <!-- DISABLE_SELECTIVE:缓存除标识 @Cacheable(false) 以外的所有实体类 -->

    <!-- UNSPECIFIED:默认值,JPA 产品默认值将被使用 -->

    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>//二级缓存扫描策略

  1. 配置二级缓存方式二

    a)       ehcache.xml配置方式

  1. 缓存命中的条件

    a)       一级缓存:同一个EntityManagerFactory,同一个EntityManager,OID相同

    b)  Domain类二级缓存配置的命中条件:同一个EntityManagerFactory,不同一个EntityManager,OID相同,Domain类上面配置@Cacheable(true)

    Domain类里面集合的二级缓存配置: 同一个EntityManagerFactory,不同一个EntityManager,OID相同

    c)  Domain类里面集合上面配置@Cacheable(true)

    @Cache(usage = CacheConcurrencyStrategy.READ_ONLY)

    如果配置了domain类里面集合里面的二级缓存,还需要配置domain类里面集合里面泛型对应的 domain类的二级缓存

    d)       查询缓存(就是通过JPQL语句进行缓存)配置的话就和二级缓存配置一样

    同一个EntityManagerFactory,不同一个EntityManager,发出的sql语句必须相同并且查询的条件值也要相同

    如果有查询条件,就不能使用查询缓存,命中率非常低

    必须添加代码query.setHint(QueryHints.HINT_CACHEABLE, true);将数据放入缓存

    每个query对象都要加入这句代码

    缓存查询数据策略:查询数据时,先从一级缓存拿数据,如果没有,就去二级缓存中拿数据,如果还是没有就从数据库查询数据,这时就会将数据放入一级、二级缓存(前提是要配置了二级缓存),    第二次同一个EntityManager对象去查询同一条数据时,就会先从一级缓存中获取,如果是另一个EntityMananger对象访问同一条数据时,就从二级缓存中去拿

  1    二级缓存使用场景

       a) 读取大于修改的时候,查询居多时使用二级缓存

       b) 读数据要有独享的控制,不能对第三方程序修改

       c) 可以容忍一些无效的数据,非关键性数据

       d) 如果数据大于内存,不适合放入缓存

  1. 缓存淘汰策略
           lru:在缓存中找最近很少使用的数据进行淘汰

           fifo:最先进入缓存中的数据最先被淘汰
           lfu:根据缓存中数据缓存的频率来进行淘汰

转载于:https://www.cnblogs.com/8888-lhb/p/11239324.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值