J'ai une base de données existante d'un système de location de films. Chaque film a un a un attribut évaluation. Dans SQL, ils ont utilisé une contrainte de limiter les valeurs possibles de cet attribut.
CONSTRAINT film_rating_check CHECK
((((((((rating)::text = ''::text) OR
((rating)::text = 'G'::text)) OR
((rating)::text = 'PG'::text)) OR
((rating)::text = 'PG-13'::text)) OR
((rating)::text = 'R'::text)) OR
((rating)::text = 'NC-17'::text)))
Je pense qu'il serait bien d'utiliser un enum de Java à la carte de la contrainte dans le monde objet. Mais il n'est pas possible de simplement prendre les valeurs autorisées en raison de la char spécial dans "PG-13" et "NC-17". J'ai donc mis en application les enum:
public enum Rating {
UNRATED ( "" ),
G ( "G" ),
PG ( "PG" ),
PG13 ( "PG-13" ),
R ( "R" ),
NC17 ( "NC-17" );
private String rating;
private Rating(String rating) {
this.rating = rating;
}
@Override
public String toString() {
return rating;
}
}
@Entity
public class Film {
..
@Enumerated(EnumType.STRING)
private Rating rating;
..
Avec la méthode toString() de la direction enum -> Chaîne fonctionne correctement, mais la Chaîne -> enum ne fonctionne pas. J'obtiens l'exception suivante:
[TopLink Avertissement]: 2008.12.09 01:30:57.434--ServerSession(4729123)--Exception [TOPLINK-116] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.des exceptions.DescriptorException Description de l'Exception: Pas de conversion valeur fournie pour la valeur [NC-17] dans le champ [FILM.CLASSEMENT]. Cartographie: oracle.toplink.essentials.les mappages.DirectToFieldMapping[cote-->FILM.NOTATION] Descripteur: RelationalDescriptor(de.fhw.nsdb.les entités.Film --> [DatabaseTable(FILM)])
cheers
timo