У меня есть существующая база данных системы проката фильмов. Каждый фильм имеет атрибут рейтинга. В SQL они использовали ограничение для ограничения допустимых значений этого атрибута.Как использовать перечисления с JPA
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 для сопоставления ограничения в мир объектов. Но нельзя просто принимать разрешенные значения из-за специального символа в «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() направление перечисления -> Строка работает отлично, но String -> перечисление не работает. Я получаю следующее исключение:
[TopLink Warning]: 2008.12.09 01: 30: 57.434 - ServerSession (4729123) - Исключение [TOPLINK-116] (Oracle TOPLINK Основы - 2.0.1 (Построить b09d-fcs (12/06/2007)): oracle.toplink.essentials.exceptions.DescriptorException Exception Описание: Значение преобразования [NC-17] в поле отсутствует. [FILM.RATING]. Отображение: oracle.toplink.essentials.mappings.DirectToFieldMapping [рейтинг -> FILM.RATING] Descriptor: RelationalDescriptor (de.fhw.nsdb.entities.Film -> [DatabaseTable (ФИЛЬМ)])
веселит
Timo
вы опустить атрибут @Column для поля намеренно? Без него было бы трудно сохранить что-либо ... – Yuval 2008-12-09 12:53:12
Вам нужен статический хэш-файл из ваших перечислений в вашем перечислении, а также статический метод getByRating – JeeBee 2008-12-09 14:06:07