您的位置:首页 > 其它

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

2018-03-28 00:12 435 查看

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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐