【发布时间】:2011-03-01 17:48:48
【问题描述】:
我们通过基于 java 的脚本语言 groovy 使用休眠。
我们检索记录、更新记录并保存记录。
在更新期间,我们清除关联,并在保存前重新加载这些关联。
当 Hibernate 在删除关联后但在建立新关联之前刷新记录时,我们会遇到异常,从而触发验证失败。
即我们对关联有一个约束:
class Entity {
...
static constraints = {
association1(minSize:1) //require association to have at least 1 record
}
}
更新持久记录的最佳方法是什么?
一些潜在的选择:
===============================================
[1] 创建新记录并复制属性:
def oldEntity = Entity.findByX(x)
if (oldEntity) {
oldEntity.properties = newEntity.properties
oldEntity.save(flush:true);|
}
else {
newEntity.save(flush:true);
}
这里的担忧是这感觉很hacky - 创建一个分离的实体并在一个实时实体上复制属性。
===============================================
[2] 检索记录、更新、保存,禁用刷新:
sessionFactory.currentSession.flushMode = org.hibernate.FlushMode.MANUAL
def existingEntity = Entity.findByX(x) 现有实体.association1.clear() 现有Entity.association2.clear()
existingEntity.association1.add(new Association(...)) existingEntity.association2.add(new Association(...))
sessionFactory.currentSession.flushMode = org.hibernate.FlushMode.AUTO 现有实体.save(flush:true)
不确定这种方法 - 不喜欢这种对 Hibernate 状态管理的干扰
===============================================
[3] 将刷新模式永久设置为手动,并使用 save() 和 save(flush:true) 以 cascade:"all-delete-orphan" 保存记录,以确保管理关联。
这里的问题是这不是默认值 - 并且依赖于我们来管理 Hibernate 的刷新。
===============================================
总结:
所有这些方法似乎都很有味道 - 任何人都可以建议最不坏的方法 - 甚至是这种情况下的最佳实践吗?
谢谢
亚历克斯
【问题讨论】:
标签: hibernate validation