我想使用枚举或字符串代替列类来映射 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 {
我找不到将其更改为文档的方法。
最佳答案
将尝试回答您的问题,但老实说,不确定您的观点在哪里动摇,因为它对于提出的实际问题是开放式的继承,并且在提供的示例中似乎没有继承的迹象。
我的第一个指针是 be here .
这确实有效,或者在默认 grails 3.2.8 上有效,但是在更新到最新的 gorm 时,更新现有记录存在问题。我当时放弃了,把它作为单独的类(class)来做。
如果您的问题与每个类(class)都有一张 table 有关,那么上面的设置就是您对 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。
不知何故,我认为这不是你所追求的
关于Grails GORM 继承改变判别器列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46325596/