2015-08-13 3 views
5

У меня есть таблица с тремя полями, скажем, a, b, c. Я хотел бы добавить ограничение, гарантирующее, что если a не является нулевым, то также b и c не являются нулевыми. Я сделал это, используя следующий SQLHibernate Check Annotation

ALTER TABLE sample 
ADD CONSTRAINT no_nulls 
CHECK (CASE WHEN a IS NOT NULL THEN b IS NOT NULL AND c IS NOT NULL END) 

Есть ли способ добиться такого же эффекта с помощью аннотации спящего режима @Check?

Я не могу найти полезный пример с этой аннотацией, не хотят ли разработчики использовать его вообще?

+1

Возможно, проще преобразовать «a имеет значение null или (b не является нулевым, а c не является нулевым)»? – jarlh

ответ

4

Да, это возможно, если @Check используется на уровне класса, как это:

@Entity 
@Check(constraints = "COL_A IS NULL OR (COL_B IS NOT NULL and COL_C IS NOT NULL)") 
public class Sample { 

    @Column(name = "COL_A") 
    private Long a; 

    @Column(name = "COL_B") 
    private Long b; 

    @Column(name = "COL_C") 
    private Long c; 

} 

(Обратите внимание, что я переписал свое состояние, используя @jarlh комментарий.). Предложение constraints аннотации @Check должно ссылаться на атрибут name@Column (он должен быть чистым SQL).

@Check аннотация должна быть на уровне класса из-за Hibernate bug.

+0

Предположим, у меня есть: //////////// @Column (name = "sample") private Long a; ////////// Какой я должен использовать в контрольном ограничении? 'a' или 'sample'? Я предполагаю, что вопрос: существует ли HQL или SQL? – Tomasz

+1

Я отредактировал мое сообщение, чтобы отразить этот случай использования. – Tunaki