Bonjour,

je voudrais savoir s'il existe un moyen de spécifier en annotations JPA une contraint unique sur plusieurs colonnes dont l'une est nullable.

Voici la classe pour laquelle j'ai ce problème:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = {"key", "lang", "country"}))
@NamedQueries({
        @NamedQuery(name = "Message.findByLangAndCountry", query = "select m.text from Message m where key=:key and lang=:lang and country=:country"),
        @NamedQuery(name = "Message.findByLang", query = "select m.text from Message m where key=:key and lang=:lang and country=null")
})
public class Message {
 
    @Id
    @GeneratedValue
    private long id;
 
    @Column(nullable = false)
    private String key;
 
    @Column(nullable = false)
    @Pattern(regexp = "[a-z]{2}", message = "Language code should be exactly 2 characters long")
    private String lang;
 
    @Column(nullable = true)
    @Pattern(regexp = "[a-z]{2}", message = "Country code should be exactly 2 characters long.")
    private String country;
 
    @Column(nullable = true)
    private String text;
Etant donné que, pour postgresql (comme pour d'autres bases de données), NULL != NULL, postgresql permet d'insérer 2 fois le même valeurs si la colonne country est nule:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
teafish=# insert into message (id, key, lang, country, text) values (nextval('hibernate_sequence'), 'label.favorites', 'fr', null, 'Favorites');
INSERT 0 1
teafish=# insert into message (id, key, lang, country, text) values (nextval('hibernate_sequence'), 'label.favorites', 'fr', null, 'Favorites');
INSERT 0 1
Bien sur, je peux m'en sortir en mettant une chaîne de caractères vide à la place. Mais, par curiosité, je voudrais savoir s'il y a un moyen de spécifier cela en JPA?

Merci d'avance.