JPA - 为SINGLE TABLE层次结构抽象类的两个子类分配不同的唯一约束

时间:2014-04-04 11:07:07

标签: java hibernate jpa

我有3个课程:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public abstract class Tag {
    @Id
    private String id;
    private String name;
}

@Entity
@Table(uniqueConstraints=
        @UniqueConstraint(columnNames={"name"}))
public class SystemTag extends Tag {

}

@Entity
@Table(uniqueConstraints=
        @UniqueConstraint(columnNames = {"name", "user"}))
public class CustomTag extends Tag{
    @ManyToOne
    private User user;
}

所以我想为系统标签使用唯一的名称,为自定义标签使用唯一的名称 - 用户对(多个用户可以创建相同的标签)但是我得到两个警告如下:

<timestamp> WARN  AnnotationBinder:601 - HHH000139: Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy: <domain>.CustomTag
<timestamp> WARN  AnnotationBinder:601 - HHH000139: Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy: <domain>.SystemTag

它允许我为同一个用户创建两个具有相同名称的系统标签和两个同名的自定义标签。

我该如何处理?

1 个答案:

答案 0 :(得分:3)

如果您使用的是一张显然不起作用的单一表格。

切换到使用JOINED策略

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Tag {
    @Id
    private String id;
    private String name;
}

然后您将拥有一个CustomTag表和SystemTag表,其中包含预期的唯一约束。