grails - 自定义插入和更新方法被自动保存击败

标签 grails gorm grails-domain-class

我正在将Grails应用程序从Oracle移植到MySQL数据库。原始的Oracle版本是一个旧数据库,它使用几个复杂的 View ,这些 View 利用了Oracle没有的MySQL的INSTEAD OF INSERT或UPDATE功能。作为一种解决方法,我在Domain类上实现了指向这些 View 的Insert和Update方法。例如,

class AdminUser {
    //...
    def update() {
        if(this.validate()) {
            Sql sql = Utils.getHibernateSql()

            sql.execute(
                "update table_x ...",
                [...]
            )

            sql.execute(
                "update table_y ...)",
                [...]
            )

            sql.execute(
                "update table_z ...",
                [...]
            )

            return true
        }

        return false
    }
    //...
}

这是我目前遇到的问题的描述:
  • 在服务方法中,我使用AdminUser.get加载AdminUser的实例。
  • 我修改了加载的实例并调用了update(),一切都很好
  • 服务方法完成执行后,由于实例上调用save的操作而引发了异常。

  • 如何防止步骤3中发生神奇的保存(我最近读到某个地方,Grails将自动保存修改的Domain类实例,该实例在退出服务方法时尚未保存,但是我似乎找不到现在链接到该资源)?

    最佳答案

    您会将修改后的实例留在休眠 session 中,带有脏字段。休眠 session 刷新后,它将尝试使用通常的save()方法再次保存该对象。

    一种解决方案是在您手动保存更改后从休眠 session 中丢弃您的对象。例如:

    def update() {
        if(this.validate()) {
            Sql sql = Utils.getHibernateSql()
    
            sql.execute(
                "update table_z ...",
                [...]
            )
    
            ...
    
            this.discard()  // remove the object from the hibernate session
            return true
        }
    

    另外,您可以将其添加到Config.groovy以要求显式保存对象:
    hibernate.flush.mode="manual"
    

    关于grails - 自定义插入和更新方法被自动保存击败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3917161/

    相关文章:

    grails - 如何将类似服务的组件注入(inject) Grails 域对象?

    hibernate - 当一个人的pk引用另一个人的pk时,如何在GORM中映射实体

    grails - 如何配置settings.groovy以使用多个存储库?

    java - 使用 Gradle 将 .jar 发布到私有(private) Maven

    Grails 3.3.1-注册新约束

    hibernate - 如何获取和使用 transient 实例?

    grails - 我可以在createCriteria中进行数学运算吗

    Grails Spring Security UI、用户和​​角色管理访问

    grails - Grails GORM按CASE语句排序

    grails - 通过生成的ID检索域实例