如何使用自定义逻辑创建唯一约束?

cgvd09ve  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(284)

使用spring数据,我创建了user 1:n userdog n:1 dog关系。两者 1:N 关系是单向的 @ManyToOneUserDog 作为自定义关系表。
用户实体:

@Entity
public class User {

    @Id
    @GeneratedValue
    private long id;

    @Column(nullable = false)
    private String name;
}

狗实体:

@Entity
public class Dog {

    @Id
    @GeneratedValue
    private long id;

    @Column(nullable = false)
    private String name;
}

用户狗关系表:

@Entity
public class UserDog {

    @Id
    @GeneratedValue
    private long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn
    @OnDelete(action = OnDeleteAction.CASCADE)
    private User user;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Dog dog;

    @Column(nullable = false)
    private Instant createdOn = Instant.now();

    @Column
    private Instant disabledOn;
}

用例
用例用于存储 User - Dog 混凝土 Dog 只能绑定到一个 User 当时。
所以我加了一句 createdOn 以及 disabledOn 列到 UserDog . disabledOn 存在 null 指示关系处于活动状态,并且 Dog 不能再分配一个 User . 如果 disabledOn 如果不为null,则存储记录仅用于证据目的,并且 Dog 可以分配给同一个或另一个 User 再一次。
问题
如何保证 Dog 的id和 disabledOn 空值在中是唯一的 UserDog table?在伪代码中,我想要这样的东西:

@Entity
@UniqueConstraint({@UniqueConstraint(this.dog.id), @NullConstraint(this.disabledOn)})
    public class UserDog {...}
xn1cxnb4

xn1cxnb41#

您可以简单地为创建一个唯一的约束 dogId 以及 disabledOn .
它确实增加了限制,即没有两个关系可以同时结束,但这似乎适合您的用例。

相关问题