使用注释的条件唯一约束

时间:2016-09-07 10:25:11

标签: java mysql spring hibernate unique-constraint

我有两个不同类型的相关实体(GENERAL和CUSTOM),我将它保存在同一个表中。类型为GENERAL的实体应具有唯一的字段名称值,并且CUSTOM可以为不同的用户提供重复项,而不是重复的GENERAL名称。 我正在寻找一种创建条件唯一约束的方法来检查下一个案例:

  • 如果实体的类型为GENERAL,则名称应为唯一
  • 如果实体具有CUSTOM类型,则名称可以在表格中重复但不能复制GENERAL项目,并且对于特定用户应该是唯一的(按用户ID)

    @Entity
    @Table(name = "Purpose", uniqueConstraints = @UniqueConstraint(columnNames = {"purposeId"}))
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    public class GeneralPurpose {

    @Id @GeneratedValue(strategy=GenerationType.AUTO, generator="purpose_seq_gen") @SequenceGenerator(name="purpose_seq_gen", sequenceName="PURPOSE_SEQ") @Column(name = "purposeId", nullable = false) private long purposeId;

    @Column(name = "type", nullable = false) @Enumerated(EnumType.STRING) private PurposeType type;

    @Column(name = "name", nullable = false) private String name;

    @Entity
    @Table(name = "Purpose")
    public class CustomPurpose extends GeneralPurpose {

    @ManyToOne() @JoinColumn(name="id") @JsonIgnore private User user;

    public enum PurposeType {
        GENERAL, CUSTOM
    }

1 个答案:

答案 0 :(得分:0)

您可以通过向“目的”表添加另一列来完成此操作。此列用于存储GENERAL记录的常量值和CUSTOM记录的用户ID。对于GENERAL记录,值可以是0(如果用户标识是数字)或“GENERAL”(如果用户标识是字符串)。它可以命名为'userOfRecord'或'recordDiscriminator',就像那样。

然后您可以在[type,name,userOfRecord]上添加唯一约束。