带有DiscriminatorColumn的JPA实体继承和UniqueConstraint

时间:2016-03-23 17:01:59

标签: 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和名称的组合应该是唯一的。

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

1 个答案:

答案 0 :(得分:1)

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

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