日期:2014-05-20  浏览次数:20781 次

关于hibernate 的saveOrUpdate的疑问?
1:如果是数据库中没有的数据就调用save方法,存在则调用update方法,是不是这样?

2:但是po对象查询(load)出来后,属性没有做过任何的变更,他还会调用update方法吗?

Java code
<prop key="hibernate.show_sql">true</prop>

ps:我测试后发现,在2的情况下saveOrUpdate方法,控制台只输出了select SQL语句,没有调用update SQL语句。
但是我把saveOrUpdate方法改为update方法后,无论你属性有没有变更,都会调用update SQL语句。
请问saveOrUpdate与update有很大的区别不?


------解决方案--------------------
引用Hibernate_3.2.0_Reference_zh_CN.chm里面的原话

saveOrUpdate()用途和语义可能会使新用户感到迷惑。 首先,只要你没有尝试在某个session中使用来自另一session的实例,你就应该不需要使用update(), saveOrUpdate(),或merge()。有些程序从来不用这些方法。 

通常下面的场景会使用update()或saveOrUpdate(): 

程序在第一个session中加载对象 

该对象被传递到表现层 

对象发生了一些改动 

该对象被返回到业务逻辑层 

程序调用第二个session的update()方法持久这些改动 

saveOrUpdate()做下面的事: 

如果对象已经在本session中持久化了,不做任何事 

如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常 

如果对象没有持久化标识(identifier)属性,对其调用save() 

如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save() 

如果对象是附带版本信息的(通过<version>或<timestamp>) 并且版本属性的值表明其是一个新实例化的对象,save()它。 

否则update() 这个对象