2016-02-06 3 views
1

Возможно ли в модели hibernate использовать пример использования, в котором у вас есть два поля, и любой из них может быть нулевым, но по крайней мере один из них не должно быть нулевым? Ниже приведен код, который у меня есть на данный момент, но мне не нравится тот факт, что я должен установить оба из них в @Column(nullable = true). В моем случае я хочу либо личный адрес электронной почты, либо рабочий адрес. Есть ли хороший способ поддержать это? Или нужен альтернативный подход?Hibernate - Любое поле A OR B может быть нулевым, но один из A или B не должен быть нулевым.

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; 

    //... 

} 
+0

посмотреть на побитовые операции XOR [http://stackoverflow.com/questions/1991380/what-does-the-operator-do -in-java] (http://stackoverflow.com/questions/1991380/what-does-the-operator-do-in-java) –

+0

@leviClouser, как он может помочь здесь? –

ответ

0

Я рекомендовал бы, чтобы вы в любом случае определить 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(); 
    } 
} 
Смежные вопросы