【发布时间】:2019-04-28 01:37:12
【问题描述】:
我正在使用 grails v3.2.9
我有 2 个域类(A 类和 B 类)具有一些共同的属性。我创建了一个新类C,从A 和B 中提取公共属性到C,并使A 和B 扩展C,如下所示:
class A extends C {
String x
static constraints = {}
}
class B extends C {
String y
static constraints = {}
}
class C {
String z
static constraints = {}
static mapping = {
tablePerConcreteClass true
}
}
我希望 C 反映 JPA @MappedSuperClass,所以我检查了 documentation for grails v3.1.12 并发现 tablePerConcreteClass 这似乎正是我需要的,但是在 documentation for grails v3.2.9 中注意到 tablePerConcreteClass而且我什至不确定 grails 3.2.9 是否支持该策略。
无论如何,我尝试将tablePerConcreteClass 与我的 grails v3.2.9 一起使用并得到以下异常:
org.springframework.beans.BeanInstantiationException: 无法实例化 [org.grails.orm.hibernate.HibernateDatastore]: 构造函数抛出异常;嵌套异常是 org.hibernate.MappingException: org.hibernate.dialect.MySQL5Dialect 不支持序列
我已经看到了一些在src/groovy 包中创建父类并使其抽象的解决方案,但这不是我需要的,我希望父类也是一个域类,以便能够编写约束也在一个地方。
更新 *****
我还发现,如果我将C 抽象为抽象,则将关系放入其中,然后将A 扩展如下:
abstract class C {
Bar bar
static constraints = {}
}
class A extends C {
String x
static constraints = {}
}
那么人工属性barId,允许在不加载关系的情况下获取关系的id,不是由grails创建的,所以使用
A.get(1).barId 结果为 groovy.lang.MissingPropertyException。
相反,如果我们将Bar bar关系放入子类A中,则会创建barId人工属性,所以如果有解决这个问题的方法,请提及。
【问题讨论】:
标签: java hibernate grails groovy grails-orm