У меня есть существующая база данных системы проката фильмов. Каждый фильм имеет атрибут рейтинга. В SQL они использовали ограничение для ограничения допустимых значений этого атрибута.
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)))
Я думаю, было бы неплохо использовать перечисление Java для сопоставления ограничения в мир объектов. Но просто невозможно принять допустимые значения из-за специального char в "PG-13" и "NC-17". Поэтому я внедрил следующее перечисление:
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;
..
С помощью метода toString() направление enum → String отлично работает, но String → enum не работает. Я получаю следующее исключение:
[Предупреждение TopLink]: 2008.12.09 01: 30: 57.434 - ServerSession (4729123) - Исключение [TOPLINK-116] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DescriptorException Exception Описание: для значения [NC-17] в конвертере нет значения преобразования поле [FILM.RATING]. Отображение: oracle.toplink.essentials.mappings.DirectToFieldMapping [рейтинг → FILM.RATING] Дескриптор: RelationalDescriptor (de.fhw.nsdb.entities.Film → [DatabaseTable (пленка)])
приветствия
Timo