我有一个实体,它是一个AccessCard,我希望有一个布尔字段“active”。例如,多个人可能已经拥有了AccessCard,但它只对当前持有者有效。 当前持有者将具有有效字段=真,并且所有先前持有者将具有有效字段=假。
显然我可以在接口端处理这个问题,并且不允许在取消激活之前激活卡,但我也希望数据库中存在这种约束。
我应该如何注释“活动”列?
答案 0 :(得分:2)
您使用的是哪种RDBMS?在Oracle中,你可以做一些像接受的答案HERE。
我认为JPA注释不允许基于字段值创建约束。有@UniqueConstraint
允许在字段列表上创建约束,但它仍然不考虑字段值(因为您只希望active=true
只有一个AccessCard
的记录,但很多active=false
)。
您可以做的是创建私有getter以获取访问卡分配并创建用于返回活动卡分配的公共瞬态方法。当第一次调用时,它将迭代所有赋值,拾取活动的赋值并分配给属性,这样您就不必每次调用getActiveAssignment时遍历所有的赋值。 在有效赋值的setter上,您可以为所有赋值将active设置为false,然后为预期赋值设置为true。
答案 1 :(得分:1)
而不是boolean
为什么不添加一个(可能是另一个,因为你似乎跟踪每个拥有密钥的人)@ManyToOne引用你的个人实体到AccessCard实体?
像这样:
public class AccessCard { @ManyToOne(Cascade = CascadeType.PERSIST | CascadeType.MERGE) @JoinColumn(referencedColumnName="person_id") private Person cardHolder; public getCardHolder() { return cardHolder; } } public class Person { @OneToMany(Cascade = CascadeType.PERSIST | CascadeType.MERGE) private Set posessingCards; }
null
返回时检查getCardHolder
来检查特定卡是否正在使用中。
或者你可以添加另一个方法来检查并返回一个布尔值。