2015-08-13 12 views
5

Mam tabelę z trzema polami, powiedzmy a, b, c. Chciałbym dodać ograniczenie gwarantujące, że jeśli a nie ma wartości null, to również b i c nie są puste. Zrobiłem to za pomocą następujących SQLAdnotacja sprawdzania hibernacji

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) 

Czy istnieje sposób, aby osiągnąć ten sam efekt przy użyciu hibernacji adnotacji @Check?

Nie mogę znaleźć pomocnego przykładu z tą adnotacją, czy deweloperzy zazwyczaj nie używają go w ogóle?

+1

Czy łatwiej jest przekonwertować "a ma wartość null lub (b nie ma wartości null, a c nie jest pusta)"? – jarlh

Odpowiedz

4

Tak, to jest możliwe, jeśli @Check służy na poziomie klasy tak:

@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; 

} 

(Zauważ, że przepisał swój stan przy użyciu @jarlh komentarz.). Klauzula constraints o adnotacji @Check musi odnosić się do atrybutu name z @Column (musi to być czysty SQL).

@Check adnotacja musi być na poziomie klasy ze względu na Hibernate bug.

+0

Załóżmy, że mam: //////////// @Column (name = "sample") prywatny Long a; ////////// Których należy użyć w wariancie sprawdzającym? "a" lub "próbka"? Chyba pytanie brzmi: czy jest używany HQL lub SQL? – Tomasz

+1

Edytowałem mój post, aby odzwierciedlić ten przypadek użycia. – Tunaki