Hibernate 使用新对象更新现有实体

DD.*_*DD. 6 hibernate

假设我在数据库中有一个实体 Foo。

我正在解析一些文件并创建新的 Foo 对象,并想检查已解析的 Foo 对象是否存在于数据库中(使用唯一属性)。如果它已经存在,则更新它,否则另存为新对象。

最好的方法是什么?

我可以简单地在新的 Foo 对象中设置 id 和 version 吗?

或者我最好从数据库加载 Foo 对象并从解析的文件中复制属性?

谢谢。

Rac*_*hel 5

假设 Foo 有一些大小、颜色和对齐方式的属性。

所以数据库中的 Foo 具有这些属性(并且您已经使用您的唯一性属性确定这是正确的)

id=1, size=12, color=null, alignment="c"

那么假设新的 Foo (newFoo) 对象具有以下属性

id=(none yet), size=14, color="red", alignment=null

您可以选择使用 saveOrUpdate() 方法或 merge() 方法。两者都会导致新对象被保存在旧对象上,但保持旧对象的 id。存储的新对象将具有上面的 newFoo 属性,但 id 设置为 1。

但是,如果您只想覆盖 Foo 的某些属性,则可能必须从数据库加载对象并手动复制它们。例如,在这种情况下,对齐会被 null 覆盖。如果您只想在新值不为空的情况下覆盖对齐,那么我认为您需要手动复制这些值。


Thi*_*rry -1

如果您正在解析的文件中没有 id,那么您的对象是否太复杂以至于无法使用 hql 来更新它?

喜欢 :

getHibernateTemplate().bulkUpdate("Update Foo set p1 = ?, ... where uniq_prop = ?", new Object[] {..., key});
Run Code Online (Sandbox Code Playgroud)

如果您首先加载实体,您将发出按更新选择,这将使您发送到数据库的请求加倍。hql 更新选项还具有不加载包含许多对象的休眠会话的优点(并且在解析大文件时,会话大小可能会成为需要监视的内容)。