Grails GORM继承改变鉴别器列

时间:2017-09-20 15:03:40

标签: grails groovy gorm

我想使用Enum或String代替列类来映射Grails中的表继承。

例如

@Entity
@Table(name = "person")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorValue("USR")
@DiscriminatorColumn(length = 3, discriminatorType = DiscriminatorType.STRING, columnDefinition = "CHAR(3) NOT NULL", name = "type")
public class People implements Serializable {

我找不到将其更改为文档的方法。

1 个答案:

答案 0 :(得分:0)

试图回答你的问题,但是不诚实地不确定你的观点在哪里摇摆不定,因为对于提出的实际问题仍然是开放性的,并且在提供的例子中似乎没有继承的迹象。

我的第一个指针是be here

这确实有用,或者它可以使用默认的grails 3.2.8但是在更新最新的gorm时,存在更新现有记录的问题。我放弃了,当时把它作为单独的课程。

如果你的问题涉及每个班级的表格,那么上面的设置就是你需要的grails。

通常你会这样做:

abstract class Something {
   static mapping = {
        cache true
        //tablePerConcreteClass false
        tablePerHierarchy false
       //discriminator value: 'institution'
   }
}

class SomethingElse  extends Something {
    static mapping={
        //discriminator value: 'somethingElse'
    }
}

抽象类定义与非抽象类对表的创建方式以及整个模型的工作方式有不同的不利影响。这一切都取决于要求。

上面的问题是在HQL中查询类时我遇到了一个问题,当我尝试查询instance.class时,我从HQL而不是实际的domainClass实例返回一个数字编号,显然鉴别器是第一点达到。

这些扩展类中的实际技巧是在HQL中,something.class不返回实际的类名来尝试

String query = """ select new map(type(s) as className,s.id as id) from Something s  """

类型现在将返回实际的字符串类名。 (也许你被困在哪里)

通常你可以在HQL中做到:

s.class = SomethingElse然后做某事

和HQL将根据匹配的domainClass名称计算出实际的className。

不知怎的,我不认为这就是你所追求的