Hibernate Session的saveOrUpdate()方法

开发 后端
本文讲述Hibernate Session的saveOrUpdate()方法。saveOrUpdate()方法同时包含了save()与update()方法的功能,依照对象处于临时状态还是游离状态而进行不同的行为。

saveOrUpdate()方法同时包含了save()与update()方法的功能,如果传入的参数是临时对象,就调用save()方法;如果传入的参数是游离对象,就调用update()方法;如果传入的参数是持久化对象,那就直接返回。那么,saveOrUpdate()方法如何判断一个对象处于临时状态还是游离状态呢?如果满足以下情况之一,Hibernate就把它作为临时对象。

Java对象的OID取值为null。

Java对象具有version属性并且取值为null。

在映射文件中为< id>元素设置了unsaved-value属性,并且IOD取值与unsaved-value属性值匹配。

在映射文件中为version属性设置了unsaved-value属性,并且version属性取值与unsaved-value属性值匹配。

自定义了Hibernate的Interceptor实现类,并且Interceptor的isUnsaved()方法返回Boolean.TRUE。 

在以下程序中,customer起初为游离对象,anotherCustomer起初为临时对象,session2的saveOrUpdate()方法分别将它们变为持久化对象:

  1.  // 此处省略session1持久化Customer对象的代码  
  2.  
  3.  ......  
  4.  
  5.  Session session2 = sessionFactory.openSession();  
  6.  
  7.  Transaction tx2 = session2.beginTransaction();  
  8.  
  9.  Customer anotherCustomer = new Customer();  
  10.  
  11.  anotherCustomer.setName("Tom");  
  12.  
  13. session2.saveOrUpdate(customer); // 使customer游离对象被session2关联  
  14.  
  15.  session2.saveOrUpdate(anotherCustomer); // 使anotherCustomer临时对象被session2关联  
  16.  
  17.  tx2.commit();  
  18.  
  19.  session2.close();  

如果Customer类的id属性为java.lang.Long类型,它的默认值为null,那么session2很容易就判断出customer对象为游离对象,而anotherCustomer对象为临时对象。因此session2对customer对象执行update操作,对anotherCutomer对象执行insert操作。

如果Customer类的id属性为long类型,它的默认值为0,此时需要显示设置< id>元素的unsaved-value属性,它的默认值为null:

  1. < id name="id" column="ID" unsaved-value="0"> 
  2.  
  3.     < genarator class="Custoer"/> 
  4.  
  5. < /id> 

这样,如果Customer对象的id取值为0,Hibernate就会把它作为临时对象.

 

【编辑推荐】

  1. Hibernate创建命名策略
  2. Hibernate的unsaved-value
  3. Hibernate中get和load方法的区别
  4. 项目添加Hibernate支持
  5. Hibernate区分不同对象的方法

 

责任编辑:book05 来源: 百度博客
相关推荐

2009-09-23 16:39:51

Hibernate s

2009-06-18 11:43:40

Hibernate uHibernate s

2009-06-26 16:34:50

delete()方法Hibernate S

2009-06-24 08:02:15

Hibernateupdate与save

2009-06-12 16:00:13

Session方法Hibernate

2009-06-18 13:42:48

Hibernate s

2009-09-29 16:04:29

Hibernate S

2009-09-24 17:24:20

Hibernate S

2009-09-25 13:51:13

Hibernate S

2009-09-23 17:18:16

Hibernate S

2009-09-25 09:46:03

Hibernate s

2009-09-22 10:09:21

Hibernate S

2009-09-23 17:03:08

Hibernate S

2009-09-25 10:53:40

Hibernate S

2009-09-27 14:53:38

Hibernate S

2009-09-24 16:13:05

Hibernate S

2009-09-23 11:37:31

Hibernate S

2009-09-25 11:23:13

Hibernate S

2009-09-25 15:34:42

Hibernate关联

2009-06-30 16:41:12

Hibernate的事
点赞
收藏

51CTO技术栈公众号