我有一个实体,它是一个 AccessCard,我想要一个布尔字段“活动”。因此,例如,多个人可能拥有 AccessCard,但它仅在当前持有者上有效。当前持有者的 active 字段 = true,所有以前的持有者的 active 字段 = false。
显然我可以在接口端处理这个问题,并且不允许在取消激活之前激活卡,但我也希望数据库中的这个约束。
任何想法我应该如何注释“活动”列?
我有一个实体,它是一个 AccessCard,我想要一个布尔字段“活动”。因此,例如,多个人可能拥有 AccessCard,但它仅在当前持有者上有效。当前持有者的 active 字段 = true,所有以前的持有者的 active 字段 = false。
显然我可以在接口端处理这个问题,并且不允许在取消激活之前激活卡,但我也希望数据库中的这个约束。
任何想法我应该如何注释“活动”列?
您正在使用哪个 RDBMS?在 Oracle 中,您可以在接受的答案HERE中做一些事情。
我认为没有允许基于字段值创建约束的 JPA 注释。允许在字段列表上@UniqueConstraint
创建约束,但它仍然不考虑字段值(因为您希望只有一条记录带有active=true
for AccessCard
,但很多带有active=false
)。
您可以做的是创建私有 getter 以获取访问卡分配并创建公共临时方法以返回活动卡分配。当第一次调用时,它会迭代所有的分配,拿起一个活跃的分配给属性,这样你就不必在每次调用 getActiveAssignment 时遍历所有的分配。在活动分配的设置器上,您可以将所有分配的活动设置为 false,然后将预期的分配设置为 true。
而不是boolean
为什么不添加一个(可能是另一个,因为您似乎跟踪拥有密钥的每个人)@ManyToOne 对您的个人实体的引用到 AccessCard 实体?像这样:
公共类访问卡{ @ManyToOne(Cascade = CascadeType.PERSIST | CascadeType.MERGE) @JoinColumn(referencedColumnName="person_id") 私人持卡人; 公共 getCardHolder() { 返回卡持有人; } } 公共类人{ @OneToMany(级联 = CascadeType.PERSIST | CascadeType.MERGE) 私人设置posesingCards; }
null
返回来检查特定卡是否正在使用中getCardHolder
。或者您可以添加另一个方法来进行检查并返回一个布尔值。