如何在 Grails/GORM 中将域类模型对象从一个派生类更改为另一个派生类

2024-04-23

给定以下 Grails GORM 域类并使用每个层次结构表继承:

class Book {
  static belongsTo = [ parent: Parent ]
  String title
}

abstract class Parent {
  static hasMany = [ books: Book ]
}

class A extends Parent {
  String asset
}

class B extends Parent {
  String asset
}

假设我从数据库中检索了 A 类的实例。我想将它转换为 B 类的实例。grails 的惯用方法是什么?

如果没有 hasMany 关系,我只需删除 A 并创建一个新的 B。但我不希望产生遍历大量 Books 并更新其parent_id 字段以指向新 B 的开销。

在幕后,我本质上只想执行 SQL UPDATE 将数据库字段 Parent.class 从 A 更改为 B。那么在 GORM/Grails 中执行此操作的推荐方法是什么?


Grails 或 Hibernate 中不支持此操作,因为它类似于将内存中的 A 实例更改为 B 实例,但对象具有固定类型且无法更改。无法直接访问您需要更改其值的鉴别器列。

因此,正如您所说,执行此操作的方法是通过 SQL 更新。有几个选择,但最好的可能是groovy.sql.Sql, e.g.

import groovy.sql.Sql

class FooService {
   def dataSource

   void convertToB(A a) {
      def sql = new Sql(dataSource)
      sql.executeUpdate('update parent set class=? where id=?', [B.name, a.id])
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Grails/GORM 中将域类模型对象从一个派生类更改为另一个派生类 的相关文章

  • 为什么界面构建器不能使用 UIView 的具体通用子类?

    首先 这已被投票关闭 作为为什么不能直接在 Interface Builder 中使用泛型的重复 TLDR 的答案是 IB 使用 Objective C 而 Objective C 不支持泛型 无论如何 没有办法指定泛型的 特殊性 即它使用
  • 与超类和子类构造函数接口

    我在 matlab 文档和之前有关使用 matlab 继承和类构造函数创建接口的问题中找不到帮助 为了使其整洁 放在一个包内 我可以将其压缩如下 而不是拖拽代码 一套 MyPkg有一个超类Super和一些子类Sub1 Sub2 我的大多数属
  • 如何强制调用 C# 派生方法

    我有一个由某些工具生成的类 因此我无法更改它 生成的类非常简单 没有接口 没有虚方法 class GeneratedFoo public void Write string p do something 在 C 项目中 我们希望提供一种方法
  • Javassist 增强部署失败

    我遇到了底部堆栈跟踪中指定的错误this https stackoverflow com questions 26220232 hibernate lazy loading proxy gorm static apis instanceof
  • 如何从 Grails 应用程序的 URL 中删除应用程序名称?

    我有一个应用程序在这样的 URL 上运行 http myapp mydomain com myapp http myapp mydomain com myapp 我不想要 myappURL 中的部分 那么如何去掉应用程序名称呢 我只想 ht
  • 如何使构造函数只能由基类访问?

    如果我想要一个只能从子类访问的构造函数 我可以使用protected构造函数中的关键字 现在我想要相反的 我的子类应该有一个构造函数 该构造函数可以由其基类访问 但不能从任何其他类访问 这可能吗 这是我当前的代码 问题是子类有一个公共构造函
  • C# 带有泛型的异常继承语法

    我在 NHibernate 类定义中偶然发现了这一点 public class SQLiteConfiguration PersistenceConfiguration
  • 对象关系映射继承

    有没有人really想要并使用过 ORM 工具的继承支持 如果是的话 您认为哪一个提供最好的支持 或者ORM继承是一个 天上掉馅饼 的概念吗 我已经在 Hibernate 中使用了继承 还有一些在 Django 中 并且非常后悔 组合优于继
  • 重写继承的构造函数字段时的差异?

    考虑这个简单的 Scala 类 class A val d Int Scala 之间是否存在差异 无论是行为还是生成的字节码 class B d Int extends A d and class B override val d Int
  • 在 Grails 下如何防止异常导致事务回滚?

    我的 Grails 服务遇到一个问题 即与事务无关的吞没异常会导致事务回滚 即使它与域对象的持久性无关 在我的服务中 我有一些类似的东西 updateSomething domainObj def oldFilename domainObj
  • C++:重写由另一个方法调用的受保护方法

    我有一个关于 C 继承的非常基本的问题 class A public void foo print protected void print class B public A protected void print std cout lt
  • 如何在 Groovy 中的 JSON Converter 方法中保留字母大小写?

    我正在尝试将 groovy 对象解析为 JSON 属性名称不遵循正确的驼峰式大小写形式 class Client String Name Date Birthdate 当我使用这个时 Client client new Client Nam
  • 理解@property装饰器和继承[重复]

    这个问题在这里已经有答案了 这里是 Python 3 以防万一它很重要 我试图正确理解如何实现继承 property使用 我已经搜索了 StackOverflow 并阅读了大约 20 个类似的问题 但无济于事 因为他们试图解决的问题略有不同
  • C# 中的继承树和受保护的构造函数

    给定以下继承树 以有效的方式实现它的最佳方法是什么 abstract class Foo
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • 如何在视图中调用 Grails 服务?

    简单的问题 我有一个服务类 比方说helpersService 和一个方法def constructURI params 如何从模板视图调用此方法 我尝试了以下代码但没有成功 img src 但我得到以下结果 No signature of
  • Python子类方法从超类方法继承装饰器

    我有一个具有retrieve 方法的超类 并且它的子类每个都实现自己的retrieve 方法 我希望每个retrieve 方法都被装饰为在收到相同参数时缓存返回值 而不必在每个子类中装饰该方法 装饰器似乎不能被继承 我可能可以调用超类的方法
  • Spring IO 这个名字是什么意思? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 2013 年秋季 Spring 推出了新网站 spring io http spring io 并宣布了其新平台 弹簧IO http sp
  • 部署 Grails 应用程序时出错 - 初学者

    我在部署 Grails 应用程序时遇到问题 一切都在本地测试环境中运行 ERROR localhost startStop 1 错误 context GrailsContextLoader 错误 初始化应用程序 使用名称创建 bean 时出
  • S4 类 [(子集)带有附加参数的继承

    这是一个扩展在 R 中的访问器函数中使用 callNextMethod https stackoverflow com q 24875284 2752888 2017 03 25 更新 为了说明如何仅在加载方法时失败 但在构建的包中时不会失

随机推荐