休眠 - 字段 A 或 B 可以为空,但 A 或 B 中的一个不得为空

  • 本文关键字:一个 字段 休眠 java hibernate jpa
  • 更新时间 :
  • 英文 :

是否可以

hibernate中对一个用例进行建模,其中有两个字段,其中任何一个字段都可能为空,但至少其中一个字段不得为空?以下是我目前拥有的代码,但我不喜欢必须将它们都设置为 @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;
    //...
}

如果您的数据库支持某种形式的约束,我建议您无论如何都要在数据库中定义一个CHECK约束:

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

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

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

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

最新更新