Grails GORM 继承改变判别器列

标签 grails groovy grails-orm

我想使用枚举或字符串代替列类来映射 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/

相关文章:

grails - grails-如何使用Grails日历插件使过滤器从datePicker识别值?

Gradle 加载 Groovy 3 库

grails - 更改不在 message.properties 中的 grails "no conversion strategy"错误

gradle - 压缩文件并将其移动到gradle

gradle - 如何更改Gradle 6的内部Groovy版本?

ruby-on-rails - Grails 中是否提供 Rails 风格的链式查询?

grails - 如何在grails中使用左连接?

grails - 无法在 Grails 3 中捕获数据库异常

grails - 没有读取外部配置值

java - 在 Grails Controller 中包含具有 session 范围的服务?