关于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() 这个对象