【问题标题】:org.hibernate.MappingException when using tablePerConcreteClass inheritance strategy in Grails v3.2.9在 Grails v3.2.9 中使用 tablePerConcreteClass 继承策略时出现 org.hibernate.MappingException
【发布时间】: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


    【解决方案1】:

    您可以使用抽象父类,但仍将约束写在一个地方。

    例如,您可以将 C 放入 src/main/groovy 中:

    @grails.gorm.dirty.checking.DirtyCheckDirtyCheck
    abstract class C {
        String z
    
        static constraints = {}
    } 
    

    然后在 A 和 B 中,您的约束块将如下所示:

    static constraints = {
        importFrom C
    }
    

    如果 A 和 B 可能各自具有 C 中不存在的不同附加约束,您甚至可以在 importFrom 行之后添加附加约束。

    【讨论】:

    • 我通常不使用人工的“id”属性,所以我对此没有任何答案!希望这里的其他人能够提供帮助。不要忘记也导入您的约束,否则它们将不会被应用!
    猜你喜欢
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2014-07-04
    • 2019-01-06
    • 2011-12-02
    • 1970-01-01
    相关资源
    最近更新 更多