带有 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的主要内容,如果未能解决你的问题,请参考以下文章