【问题标题】:Nested Single Table Inheritance嵌套单表继承
【发布时间】:2011-12-12 13:21:46
【问题描述】:

我遇到了对象模型和 Hibernate 的问题。我希望将整个模型存储为单个表。

我已经尝试了以下方法,但是当我要求 Hibernate 生成 SQL 创建文件时,它会创建 3 个表而不是只有 1 个。类层次结构可能看起来很奇怪,但它当然是脱离上下文的 :)

尝试 1:

@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "CATEGORY", discriminatorType = DiscriminatorType.STRING, length  = 10)
@Table(name = "the_table")
public abstract class A {}

@MappedSuperclass
@DiscriminatorValue(value = "B")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING, length = 20)
public abstract class B extends A {}

@Entity
@DiscriminatorValue(value = "X")
public class X extends B {}

@Entity
@DiscriminatorValue(value = "Y")
public class Y extends B {}

@Entity
@DiscriminatorValue(value = "Z")
public class Z extends B {}

尝试 2: 我们到了那里,不是它创建了 1 个表,而是没有生成鉴别器列。有人能发现错误吗?

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "CATEGORY", discriminatorType = DiscriminatorType.STRING, length  = 10)
@DiscriminatorFormula(value = "CATEGORY || '_' || TYPE")
@Table(name = "the_table")
public abstract class A {}

@Entity
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING, length = 20)
public abstract class B extends A {}

@Entity
@DiscriminatorValue(value = "B_X")
public class X extends B {}

@Entity
@DiscriminatorValue(value = "B_Y")
public class Y extends B {}

@Entity
@DiscriminatorValue(value = "B_Z")
public class Z extends B {}

【问题讨论】:

    标签: java hibernate single-table-inheritance


    【解决方案1】:

    删除@MappedSuperclass 并尝试。此外,您不能在一个层次结构中使用两次 @Inheritance 标记 - 只会使用一个。

    如果您想使用多个列作为鉴别器,请使用@DiscriminatorFormula

    @Entity
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    @DiscriminatorForumula("CATEGORY || '_' || TYPE")
    public abstract class A 
    
    @Entity
    @DiscriminatorValue(value = "B_X")
    public class X extends A {}
    
    @Entity
    @DiscriminatorValue(value = "B_Y")
    public class Y extends A {}
    
    @Entity
    @DiscriminatorValue(value = "B_Z")
    public class Z extends A {}
    

    【讨论】:

    • 我需要 MappedSuperClass 才能将字段映射到表。我试图从 B 类中删除继承注释,但没有运气。
    • 您应该改用@Entity。我已经用我认为可行的映射更新了答案。
    • 您需要从 A 和 B 中删除 DiscriminatorColumns。只保留 DiscriminatorFormula。列(类别和类型)不会包含在生成的架构中。如果你想这样,只需将带有 @Column 映射的普通字段添加到 A 类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    相关资源
    最近更新 更多