zoukankan      html  css  js  c++  java
  • Jpa持久对象状态,一级缓存,二级缓存

    1JPA持久对象的状态

    1.1. 临时状态(transient):瞬时状态

    刚刚用new语句创建,没有和entityManager发生关系

    没有被持久化,不处于entityManager中。该对象成为临时对象

    1.2. 持久化状态(persistent):托管状态

    entityManager发生关系

    已经被持久化,加入到entityManager的一级缓存中(persist  merge remove )

     @Test
        public void testUpdateid()throws Exception{
            EntityManager entityManager = JpaUtil.getEntityManager();
            entityManager.getTransaction().begin();
    
            OIDDomain Domain = entityManager.find(OIDDomain.class, 1L);// 持久状态
            Domain.setName("小17");
            //一级缓存
            //entityManager.persist(Domain);// 持久状态
    //提交事务
            entityManager.getTransaction().commit();
            entityManager.close();// 游离状态
        }

     

     

    该状态的对象为持久化对象。

    1.3. 游离状态(detached):脱管状态

    已经被持久化,但不处于entityManager中。

    该状态的对象为游离对象。

    1.4. 删除状态(removed):从JPA才开始有的状态

    只有调用了entityManager.remove(domain对象)方法

    对象有关联的ID,并且在entityManager管理下,

    但是已经被计划删除,事务提交就真的被删除了。

    1.5. 脏数据更新

    一个持久状态对象在事务管理内,如果改变原来的数据(非主键),此时出现脏数据,在事务提交的时候自动发出update语句去修改。

     

     @Test
    public void testUpdateid()throws Exception{
    EntityManager entityManager = JpaUtil.getEntityManager();
    entityManager.getTransaction().begin();

    OIDDomain Domain = entityManager.find(OIDDomain.class, 1L);// 持久状态
    Domain.setName("小17");
    //一级缓存
    //entityManager.persist(Domain);// 持久状态
    //提交事务
    entityManager.getTransaction().commit();
    entityManager.close();// 游离状态
    }

     

    1.5 执行流程分析

    JPAUtil获取entityManager,开启事务

    通过entityManager拿到一个对象,那么现在这个对象就是持久化的对象

    这个对象会放到一级缓存里面

    JPA会为当前这个对象准备一个快照(把这个对象进行了备份)

    第三步:提交事务

    它会把快照 你现在这个对象的数据进行对比

    如果相同,就不需要修改,也不会发送SQL(性能就高了)

    当不相同的时候,JPA就会认为现在这个数据是脏数据

    脏数据它就会在事务提交的时候,把它进行数据库的同步(发送update SQL语句)

    Hibernate: update t_iod set name=? where id=?

    2'domain对象之间的关系

     

    2.1. 依赖关系

     

    Spring管理对象之间相互依赖注入

     

    Controller表现层依赖于Service业务层,Service依赖于Dao持久层

     

    2.2. 关联关系

     

    关联按照多重性可分为一对一、一对多、多对一和多对多。 主要指的数据库()的关系

     

    按照导航性可分为单向关联和双向关联。

      喜欢一个人,但是他不认识 单相思

      一对夫妻 我中有你 你中有我,双向的

     

    2.3. 聚合关系(本质还是双向多对一,一对多)

     

    表示整体与部分的关系,整体和部分可以分开单独存在。

     

    一个男的对应多个女的 ,这多个女的每人都有自己圈子,这个gay说不定还有个gay;

    一个妓院 老鸨跑路了,手下妹子还能单独接客,牛郎还能继续旁

     

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

     

    一个订单

    2.5代码分析多对一

    @Entity
    @Table(name = "t_product")
    public class Product {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String address;
    @ManyToOne//FetchType.EAGER迫切加载
    @JoinColumn(name ="dir_id")
    private ProductDir dir;

    正确写法:先保存一方,再保存多方

     

     

     

    3一级何二级缓存

    缓存就是,牺牲内存换取时间

    一级缓存就是同一个entitymanagerfactory 同一个entitymanager 同oid(默认的)

     

    3.2.1. 添加二级缓存jar文件

    pml配置这个导报

     

    hibernate-release-4.3.8.Finalliboptionalehcache3jar文件

     

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>4.3.8.Final</version>
    </dependency>

     

     

     

    3.2.2. 搜索配置信息Cache

     

    添加persistence.xml配置信息

     

    <!-- 启用二级缓存 -->

     

    <property name="hibernate.cache.use_second_level_cache" value="true" />

     

    <!-- 二级缓存的实现类,文档里面的包名有错的 -->

     

    <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />

     

    <!-- 启用查询缓存 -->

     

    <property name="hibernate.cache.use_query_cache" value="true" />

     

    1.2. <properties>上面添加配置二级缓存扫描的策略

     

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

     

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

     

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

     

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

     

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

     

    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

     

    1.3. domain类的二级缓存

     

    二级缓存类配置:命中条件:同一个SessionFactory,不同的entityManager,OID相同

     

     

    // @Entity

     

    // @Cacheable(true)

     

    // public class Department

     

     
    
    

     

     

     

     

  • 相关阅读:
    函数式编程
    高级特性
    ZooKeeper介绍
    perl 退出函数问题
    perl 处理 回车 换行符
    定义函数
    调用函数
    python 字典
    python 条件判断
    列表和数组
  • 原文地址:https://www.cnblogs.com/13438145925xiaozheng/p/11241715.html
Copyright © 2011-2022 走看看