Hibernate - 字段A OR B可以为null,但A或B中的一个不能为空

时间:2016-02-06 21:38:45

标签: java hibernate jpa

是否有可能在hibernate中建模一个用例,在该用例中你有两个字段,其中任何一个都可以为null,但至少其中一个不能为空?以下是我目前的代码,但我不喜欢我必须将它们都设置为@Column(nullable = true)的事实。在我的情况下,我想要个人电子邮件地址或工作地址。有没有一个好方法来支持这个?或者需要另一种方法吗?

public class ApplicantDetails {

    //...

    @OneToOne(optional = false)
    private ContactDetails contactDetails;

    //...
}

public class ContactDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    /*Need at least one email address but it doesn't matter which one.*/
    @Column(nullable = true, unique = true)
    private String personalEmail;

    @Column(nullable = true, unique = true)
    private String workEmail;

    //...

}

1 个答案:

答案 0 :(得分:1)

如果你的数据库支持某种形式的话,我建议你在数据库中定义一个CHECK约束:

CHECK (PERSONAL_EMAIL IS NOT NULL OR WORK_EMAIL IS NOT NULL)

关于中间层,您可以在存储/更新ContactDetails的服务中编写自己的验证器,并在尝试存储/更新不一致状态时引发相应的异常,或者您可以使用类似的验证框架Hibernate validator

快速解决方法也可以是利用实体生命周期回调方法:

@PrePersist
@PreUpdate
private void validate() {
  if (personalEmail == null && workEmail == null) {
    throw new ValidationException();
  }
}