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

bdo*_*gru 3 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;
}
Run Code Online (Sandbox Code Playgroud)

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

<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
Run Code Online (Sandbox Code Playgroud)

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

我该如何处理?

Ala*_*Hay 6

如果您使用的是显然无法正常工作的单个表。

切换到使用 JOINED 策略

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

然后您将有一个 CustomTag 表和 SystemTag 表,按预期具有唯一约束。