假设我在数据库中有一个实体 Foo。
我正在解析一些文件并创建新的 Foo 对象,并想检查已解析的 Foo 对象是否存在于数据库中(使用唯一属性)。如果它已经存在,则更新它,否则另存为新对象。
最好的方法是什么?
我可以简单地在新的 Foo 对象中设置 id 和 version 吗?
或者我最好从数据库加载 Foo 对象并从解析的文件中复制属性?
谢谢。
假设 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 更新选项还具有不加载包含许多对象的休眠会话的优点(并且在解析大文件时,会话大小可能会成为需要监视的内容)。
| 归档时间: |
|
| 查看次数: |
5172 次 |
| 最近记录: |