在使用加入的继承策略时是否可以强制使用判别器

时间:2017-10-16 22:21:47

标签: hibernate jpa inheritance java-ee

为了我的数据库管理员,我必须使用加入的继承策略,这将更容易使用Single.Table但是,所以让我们说一个实体:

@Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    public abstract class Post{
            @Id
            @GeneratedValue(strategy = GenerationType.IDENTITY)
            protected Long id;
            protected String title;
            protected String d_type;// I want this to to be the discriminator.
}

孩子:

    @Entity
    public abstract class Book{
            protected String title;
}

这个例子很简单,为了得到一个好的答案,但实际上我正在处理5"孩子"每个都有其特定的属性和方法,除了一个让我们调用它CommonPost,它没有添加父母已经提供的内容,这就是为什么我想添加一个带有枚举类型的鉴别器,如下所示{xPost, yPost,..,CommonPost}。首先是可能的,甚至是实际的?如果不是更好的选择是可行的。

1 个答案:

答案 0 :(得分:0)

这是可能的,但如果支持,您可以咨询JPA供应商。我相信Hibernate支持这一点。他们称之为混合继承策略:

以下是一个示例:

@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="POST_TYPE")
public abstract class Post{

从技术上讲,它是一个JOINED策略,但没有什么可以阻止你添加一个鉴别器列(通常用于SINGLE-TABLE策略)。

另一个建议是:如果你说实体CommonPost没有任何特定的属性或方法,那么为什么不将它作为继承层次结构中最顶层的类呢?然后,您现在可以删除抽象类Post

以下是您的表现方式:

@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="POST_TYPE")
@DiscriminatorValue("C")
public class CommonPost {
...
@DiscriminatorValue("X")
public class XPost extends CommonPost {
...
@DiscriminatorValue("Y")
public class YPost extends CommonPost {