2

给定以下 Grails GORM 域类并使用 table-per-hierarchy 继承:

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 中推荐的方法是什么?

4

2 回答 2

1

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

因此,正如您所说,这样做的方法是通过 SQL 更新。有几个选项,但最好的可能是groovy.sql.Sql,例如

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])
   }
}
于 2011-04-20T05:33:18.170 回答
1

看起来像是设计缺陷的标志。

您可以尝试用聚合替换继承 - “优先对象组合优于类继承”。(Gang of Four 1995:20) " -HasAsset从.ParentHasAsset

Groovy 代表团可以提供帮助。

于 2011-04-20T08:38:06.433 回答