我正在使用 grails v3.2.9
我有 2 个域类(A
类和 B
类)具有一些共同的属性。我创建了一个新类 C
,将 A
和 B
的公共(public)属性提取到 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
反射(reflect) 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: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is org.hibernate.MappingException: org.hibernate.dialect.MySQL5Dialect does not support sequences
我看到一些解决方案在 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
人工属性,因此请提及解决方案如果有这个问题。
最佳答案
您可以使用抽象父类并仍然在一个地方编写约束。
例如,您可以将 C 放入 src/main/groovy 中:
@grails.gorm.dirty.checking.DirtyCheckDirtyCheck
abstract class C {
String z
static constraints = {}
}
然后在 A 和 B 中,您的约束 block 将如下所示:
static constraints = {
importFrom C
}
如果 A 和 B 可能各自具有 C 中不存在的不同附加约束,您甚至可以在 importFrom
行之后添加附加约束。
关于java - org.hibernate.MappingException 在 Grails v3.2.9 中使用 tablePerConcreteClass 继承策略时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53480593/