给定以下 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(使用前将#替换为@)