JPA Unique布尔列

时间:2013-08-10 14:12:20

标签: java database jpa unique-constraint

我有一个实体,它是一个AccessCard,我希望有一个布尔字段“active”。例如,多个人可能已经拥有了AccessCard,但它只对当前持有者有效。 当前持有者将具有有效字段=真,并且所有先前持有者将具有有效字段=假。

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

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

2 个答案:

答案 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来检查特定卡是否正在使用中。 或者你可以添加另一个方法来检查并返回一个布尔值。
  • 这样可以确保将卡片转移给新人并将其从当前卡片中删除,并检查它是否有效只会检查是否为空。
  • 通过将钥匙分配给一个人,一石二鸟,您知道它是否活跃以及谁拥有它,可以有效地处理激活/停用。