java - JPA 实体继承和带有 DiscriminatorColumn 的 UniqueConstraint

标签 java hibernate jpa orm

我正在将 Hibernate 与 JPA 2.1 一起使用,并且我想定义一个具有两个子实体的实体。我的问题是我想定义一个包含两列的 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 和名称的组合应该是唯一的。

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

最佳答案

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

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

关于java - JPA 实体继承和带有 DiscriminatorColumn 的 UniqueConstraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36184376/

相关文章:

mysql - HQL 如何处理没有小时、分钟、秒的星期几和日期的等于?

Hibernate JPA 不为空值在集合表中插入行

java - 在struts2中基于java flg制作一个按钮禁用/启用

C# Interop with C vs Interop with Java : Which is better/easier/faster?

java - 如何访问 HQL 中的枚举属性?

java - Hibernate 在获取连接中重新加载实体

java - 使用映射实体映射对象

jakarta-ee - "JBAS016069: Error injecting persistence unit into CDI managed bean."部署依赖于 EJB-JAR 的 WAR 时

java - 如何为具有 3 个概率的 void 函数编写 JUnit 测试?

java - 如何随机显示画线的距离?