java - org.hibernate.MappingException 在 Grails v3.2.9 中使用 tablePerConcreteClass 继承策略时

标签 java hibernate grails groovy grails-orm

我正在使用 grails v3.2.9

我有 2 个域类(A 类和 B 类)具有一些共同的属性。我创建了一个新类 C,将 AB 的公共(public)属性提取到 C 并制作了 AB 扩展 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/

相关文章:

email - 从服务grails调用的模板中获取当前域

ruby-on-rails - Groovy/Grails::Ruby/Rails::2011 框架状态

java - 当异常发生时如何运行迭代

java - Java 中的 Fluent Builder/DSL 示例

java - android - 获取软键盘按键

java - 左加入 hql 中的第一场比赛

java - Hibernate saveOrUpdate 方法创建新条目/行而不是更新现有条目/行

java - ReSTLet 客户端卡住 HTTPS 请求

hibernate - 将整个表加载到缓存Grails中

grails - 集成测试期间访问另一个线程中的数据库行