带有 DiscriminatorColumn 的 JPA 实体继承和 UniqueConstraint

Posted

技术标签:

【中文标题】带有 DiscriminatorColumn 的 JPA 实体继承和 UniqueConstraint【英文标题】:JPA Entity Inheritance and UniqueConstraint with DiscriminatorColumn 【发布时间】:2016-03-23 17:01:58 【问题描述】:

我在 JPA 2.1 中使用 Hibernate,我想定义一个包含两个子实体的实体。我的问题是我想定义一个包含两列的 UniqueConstraint:一个 MemberField 和 DiscriminatorColumn。

编辑:因为 Nicholas 的回答解决了我的具体问题,所以我将父类的类型从抽象更改为非抽象。

我的代码如下所示:

家长

@Entity
@Inheritance
@DiscriminatorColumn(name = "TYPE")
@Table(name = "EXAMPLE", uniqueConstraints = @UniqueConstraint(columnNames =  "TYPE", "NAME" ) )
public class ExampleParent extends AbstractEntity

    private static final long serialVersionUID = 68642569598915089L;

    @Column(name = "NAME", nullable = false, length = 30)
    @NotNull
    private String name;

    ...


孩子 1

@Entity
@DiscriminatorValue("TYPE1")
public class Example1 extends ExampleParent

    private static final long serialVersionUID = -7343475904198640674L;

    ...


孩子 2

@Entity
@DiscriminatorValue("TYPE2")
public class Example2 extends ExampleParent

    private static final long serialVersionUID = 9077103283650704993L;

    ...


现在我不想在 ExampleParent 的名称上使用 UniqueConstraint,因为我希望能够保留 Example1 和 Example2 的两个同名对象。下面的代码应该解释它:

@Autowired
Example1Repository example1Repo;

@Autowired
Example2Repository example2Repo;

Example1 example1 = new Example1();
example1.setName("example");
example1Repo.save(example1);

Example2 example2 = new Example2();
example2.setName("example");
example2Repo.save(example2);

所以我的目标是设置两列的 UniqueConstraint,但我实际上想使用 DiscriminatorColumn 和我的 ExampleParent 的一个字段。 DiscriminatorColumn 和名称的组合应该是唯一的。

我的代码不起作用,我有什么选择?

【问题讨论】:

使用上面的代码,您会获得 ConstraintViolationException 吗?您的意思是您不能插入具有相同名称的 Example1 和 Example2 ? @oliv37 是的,我得到一个 ConstraintViolationException: Duplicate entry 'example' for key ... 【参考方案1】:

如果您使用的是抽象基类,我希望您将使用@MappedSuperclass 注释而不是@Inheritance

@MappedSuperclass 更适合多态性,这就是你所拥有的。我不认为@Inheritence 支持多态性。

【讨论】:

首先感谢您的回答。你是对的:在我的情况下,最好使用@MappedSuperclass,因为我不会有自己的父类实体。尽管如此,我还是在问自己如何解决最初的问题。是否可以将成员字段的@UniqueConstraint@DiscriminatorColumn 结合起来?

以上是关于带有 DiscriminatorColumn 的 JPA 实体继承和 UniqueConstraint的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 DiscriminatorColumn 作为外键并加载实体

Hibernate 继承映射

带 H2 的 ClassCastException

JPA 鉴别器类型性能

使用 SingleTable 进行休眠继承

将子类映射为其扩展父类