Hibernate 使用Grails(GORM)在继承模型中获取特定实体

Hibernate 使用Grails(GORM)在继承模型中获取特定实体,hibernate,inheritance,grails,gorm,Hibernate,Inheritance,Grails,Gorm,我们需要构建几个相似的实体,它们之间的差异很小,我们决定使用GORM中可用的继承。 我们的域类如下所示: class Idea extends AuditableEntity { Project project User user String content static mapping = { content type: 'text' autoTimestamp true } static constr

我们需要构建几个相似的实体,它们之间的差异很小,我们决定使用GORM中可用的继承。 我们的域类如下所示:

class Idea extends AuditableEntity {

    Project project
    User user

    String content

    static mapping = {
        content type: 'text'

        autoTimestamp true
    }

    static constraints = {
        content nullable: false, blank: false
    }

}
其中一个孩子:

class FpIdea extends Idea {

    FortyPrinciplesApplication fpApplication
    Principle principle

    static mapping = {
        importFrom Idea

        discriminator 'fp_idea'

        table 'fp_idea'
    }

    static constraints = {
        importFrom Idea

        fpApplication nullable: false
        principle nullable: false
    }

}
现在,一切都按预期工作,如果我们知道对象类型应该是什么,我们就可以轻松地提取正确的对象类型。 然而,有没有一种方法可以简单地通过id(不知道类型之前的类型)获得idea对象,并且仍然以正确的类型获得它


如果我们通过
Idea
发出请求,那么我们将得到一个
Idea
对象,该对象具有
expandoMetaclass
。不确定这是否有帮助。

显然,它已经开箱即用了。 所以,如果我尝试得到这样一个对象:

Idea.findByIdAndProjectAndUser(id, project, user)
它提供了正确的对象类型。但是,这些信息具有误导性

  • 您可以删除鉴别器自定义
  • 鉴别器“fp_idea”

    在这种情况下,Grails将使用默认的鉴别器(默认情况下,类列具有完整的类名) 要检查类型,您可以使用以下内容:

    Idea.get(1L).class == FpIdea
    
  • 或者,您可以为每个子类使用不同的表:
  • 在父域中

    static mapping = {
            tablePerHierarchy false
        }