这是
update()和之间的语义差异
merge()。
摘自Christian Bauer和Gavin King的《
Hibernate的Java持久性》(我在Hibernate文档中找不到对此行为的清晰解释):
update()方法强制更新到数据库中对象的持久状态,始终调度SQL UPDATE。
…
在将项目对象传递给update()之前或之后进行修改都没有关系。
…
Hibernate始终将对象视为脏对象,并计划将在刷新期间执行的SQL UPDATE.。
另一方面,
merge()首先查询数据库,如果状态未更改,则不执行更新。
因此,如果要让Hibernate首先查询数据库,则需要使用
merge()(尽管
update()可以通过
@org.hibernate.annotations.Entity(selectBeforeUpdate= true)在实体上指定来替代的默认行为)。



