1

我有一个实体,它是一个 AccessCard,我想要一个布尔字段“活动”。因此,例如,多个人可能拥有 AccessCard,但它仅在当前持有者上有效。当前持有者的 active 字段 = true,所有以前的持有者的 active 字段 = false。

显然我可以在接口端处理这个问题,并且不允许在取消激活之前激活卡,但我也希望数据库中的这个约束。

任何想法我应该如何注释“活动”列?

4

2 回答 2

2

您正在使用哪个 RDBMS?在 Oracle 中,您可以在接受的答案HERE中做一些事情。

我认为没有允许基于字段值创建约束的 JPA 注释。允许在字段列表上@UniqueConstraint创建约束,但它仍然不考虑字段值(因为您希望只有一条记录带有active=truefor AccessCard,但很多带有active=false)。

您可以做的是创建私有 getter 以获取访问卡分配并创建公共临时方法以返回活动卡分配。当第一次调用时,它会迭代所有的分配,拿起一个活跃的分配给属性,这样你就不必在每次调用 getActiveAssignment 时遍历所有的分配。在活动分配的设置器上,您可以将所有分配的活动设置为 false,然后将预期的分配设置为 true。

于 2013-08-10T15:50:20.513 回答
1

而不是boolean为什么不添加一个(可能是另一个,因为您似乎跟踪拥有密钥的每个人)@ManyToOne 对您的个人实体的引用到 AccessCard 实体?像这样:

公共类访问卡{

    @ManyToOne(Cascade = CascadeType.PERSIST | CascadeType.MERGE)
    @JoinColumn(referencedColumnName="person_id")
    私人持卡人;

    公共 getCardHolder() {
        返回卡持有人;
    }
}   


公共类人{

    @OneToMany(级联 = CascadeType.PERSIST | CascadeType.MERGE)
    私人设置posesingCards;
}
  • 现在,您可以通过检查null返回来检查特定卡是否正在使用中getCardHolder。或者您可以添加另一个方法来进行检查并返回一个布尔值。
  • 这将确保将卡转移给新人会将其从当前卡中删除,并且检查它是否处于活动状态将只是检查 null 代替。
  • 激活/停用可以通过将钥匙分配给一个人来有效地处理,两只鸟和一块石头,你知道它是否处于活动状态以及谁拥有它。
于 2013-08-10T15:46:57.350 回答