【问题标题】:hibernate updating persistent records休眠更新持久记录
【发布时间】: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


    【解决方案1】:

    我们采用的解决方案是将提交模式设置为“提交”,该模式仅通过手动 entity.save(flush:true) 调用刷新,如果不回滚,则在事务结束时刷新。

    Config.groovy:

    hibernate.flush.mode="commit"
    

    我们发现在 DataSource.groovy 中设置它是一个怪癖,尽管这可能是更明显的地方。此外,新线程要求我们手动设置 - 更改不会自动获取。

    EntityService.groovy:

    import org.codehaus.groovy.grails.commons.ConfigurationHolder as CH

    定义会话工厂

    ... sessionFactory.currentSession.flushMode = org.hibernate.FlushMode.parse(CH.config.hibernate.flush.mode.toUpperCase())

    这后一个代码似乎只在线程情况下是必需的,因为新线程似乎不知道这个设置,尽管其他方面是上下文感知的。

    【讨论】:

      【解决方案2】:

      对我来说,如果你真的需要清除并重新创建这些关联,第二种方法是气味较少的方法。

      如果您需要操纵模型通过无效状态,将刷新模式设置为手动没有错。

      【讨论】:

      • 感谢您的回复,出现第四个选项 - 在更新期间从休眠状态中删除(或驱逐)记录,然后在执行更新后重新关联。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多