jpa--7.api(EntityManager其他方法)

1      Merge

1.1  概念

merge (T entity):merge() 用于处理 Entity 的同步。即数据库的插入和更新操作

         总的来说: 类似于 hibernate Session saveOrUpdate 方法.

 

1.2  流程

 

1.3  传入的是一个临时对象(insert)

//1. 若传入的是一个临时对象

   //会创建一个新的对象, 把临时对象的属性复制到新的对象中, 然后对新的对象执行持久化操作. 所以

   //新的对象中有 id, 但以前的临时对象中没有 id.

   

@Test
   public void testMerge1(){
      Customercustomer= newCustomer();
      customer.setAge(18);
      customer.setBirth(new Date());
      customer.setCreatedTime(new Date());
      customer.setEmail("cc@163.com");
      customer.setLastName("CC");
     
      Customercustomer2= entityManager.merge(customer);
     
      System.out.println("customer#id:"+ customer.getId());
      System.out.println("customer2#id:"+ customer2.getId());
   }
 

 

1.4  游离对象,缓存中没有,数据库没有(insert)

//若传入的是一个游离对象, 即传入的对象有 OID.

   //1. 若在 EntityManager 缓存中没有该对象

   //2. 若在数据库中也没有对应的记录

   //3. JPA 会创建一个新的对象, 然后把当前游离对象的属性复制到新创建的对象中

   //4. 对新创建的对象执行 insert 操作.

  

 @Test
   public void testMerge2(){
      Customercustomer= newCustomer();
      customer.setAge(18);
      customer.setBirth(new Date());
      customer.setCreatedTime(new Date());
      customer.setEmail("dd@163.com");
      customer.setLastName("DD");
 
      customer.setId(100);//oid
 
      Customercustomer2= entityManager.merge(customer);
 
      System.out.println("customer#id:"+ customer.getId());
      System.out.println("customer2#id:"+ customer2.getId());
   }


 

1.5  游离对象,缓存中没有,数据库有(update)

//若传入的是一个游离对象, 即传入的对象有 OID.

   //1. 若在 EntityManager 缓存中没有该对象

   //2. 若在数据库中也有对应的记录

   //3. JPA 会查询对应的记录, 然后返回该记录对一个的对象, 再然后会把游离对象的属性复制到查询到的对象中.

   //4. 对查询到的对象执行 update 操作.

   

@Test
   public void testMerge3(){
      Customercustomer= newCustomer();
      customer.setAge(18);
      customer.setBirth(new Date());
      customer.setCreatedTime(new Date());
      customer.setEmail("ee@163.com");
      customer.setLastName("EE");
 
      customer.setId(5);
 
      Customercustomer2= entityManager.merge(customer);
 
      System.out.println(customer == customer2); //false
   }
 

 

1.6  游离对象,缓存中有(update)

//若传入的是一个游离对象, 即传入的对象有 OID.

   //1. 若在 EntityManager 缓存中有对应的对象

   //2. JPA 会把游离对象的属性复制到查询到EntityManager 缓存中的对象中.

   //3. EntityManager 缓存中的对象执行 UPDATE.

   

@Test
   public void testMerge4(){
      Customercustomer= newCustomer();
      customer.setAge(18);
      customer.setBirth(new Date());
      customer.setCreatedTime(new Date());
      customer.setEmail("dd@163.com");
      customer.setLastName("DD");
 
      customer.setId(5);
      Customercustomer2= entityManager.find(Customer.class, 4);
 
      entityManager.merge(customer);
 
      System.out.println(customer == customer2); //false
   }

2      强制同步

2.1  Flush—同步缓存

flush ():同步持久上下文环境,即将持久上下文环境的所有未保存实体的状态信息保存到数据库中。

 

2.2  Refresh—同步数据库

refresh (Objectentity):用数据库实体记录的值更新实体对象的状态,即更新实例的属性值。

         由于jpa自带一级缓存,所以查询时就直接走缓存,这个方法就是强制不走缓存而是访问数据库

 

3      其他方法

setFlushMode (FlushModeType flushMode):设置持久上下文环境的Flush模式。参数可以取2个枚举FlushModeType.AUTO为自动更新数据库实体,FlushModeType.COMMIT 为直到提交事务时才更新数据库记录。

getFlushMode ():获取持久上下文环境的Flush模式。返回FlushModeType类的枚举值。

clear ():清除持久上下文环境,断开所有关联的实体。如果这时还有未提交的更新则会被撤消。

contains (Object entity):判断一个实例是否属于当前持久上下文环境管理的实体。

isOpen ():判断当前的实体管理器是否是打开状态。

getTransaction ():返回资源层的事务对象。EntityTransaction实例可以用于开始和提交多个事务。

close ():关闭实体管理器。之后若调用实体管理器实例的方法或其派生的查询对象的方法都将抛出 IllegalstateException 异常,除了getTransaction 和 isOpen方法(返回 false)。不过,当与实体管理器关联的事务处于活动状态时,调用 close 方法后持久上下文将仍处于被管理状态,直到事务完成。

 

4      创建查询对象

 

•       createQuery (String qlString):创建一个查询对象。

•       createNamedQuery (String name):根据命名的查询语句块创建查询对象。参数为命名的查询语句。

•       createNativeQuery (String sqlString):使用标准 SQL语句创建查询对象。参数为标准SQL语句字符串。

•       createNativeQuery (String sqls, StringresultSetMapping):使用标准SQL语句创建查询对象,并指定返回结果集 Map的名称。

 

 源码参考:https://download.csdn.net/download/qq_26553781/10312434

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值