Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate-字段A或B都可以为空,但A或B中的一个不能为空_Java_Hibernate_Jpa - Fatal编程技术网

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

Java Hibernate-字段A或B都可以为空,但A或B中的一个不能为空,java,hibernate,jpa,Java,Hibernate,Jpa,在hibernate中是否可以建模一个用例,其中有两个字段,其中一个字段可以为null,但其中至少一个字段不能为null?下面是我目前拥有的代码,但我不喜欢这样的事实:我必须将它们都设置为@Column(nullable=true)。在我的情况下,我想要个人电子邮件地址或工作地址。有没有好的方法来支持这一点?还是需要另一种方法 public class ApplicantDetails { //... @OneToOne(optional = false) priva

hibernate
中是否可以建模一个用例,其中有两个字段,其中一个字段可以为null,但其中至少一个字段不能为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;

    //...

}

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

CHECK (PERSONAL_EMAIL IS NOT NULL OR WORK_EMAIL IS NOT NULL)
关于中间层,您只需在存储/更新
ContactDetails
的服务中编写自己的验证器,并在尝试存储/更新不一致状态时引发相应的异常,或者您可以使用类似的验证框架

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

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

看看leviClouser的按位异或操作,这有什么帮助?