Кажется, что необходимо добавить поддержку пользовательского типа:
Расширяющийся OracleAS TopLink для Поддержки Пользовательских Преобразований типов
Вы попытались сохранить порядковый номер. Хранилище строковое значение хорошо работает, если у Вас нет связанной Строки к значению:
@Enumerated(EnumType.ORDINAL)
У Вас есть проблема здесь, и это - ограниченные возможности JPA когда дело доходит до обработки перечислений. С перечислениями у Вас есть два варианта:
Enum.ordinal()
, который является ужасной идеей (по моему скромному мнению); или Enum.name()
. Примечание: не toString()
, как Вы могли бы ожидать, тем более, что behaviourfor Enum.toString()
по умолчанию должен возвратиться name()
. Лично я думаю, что наилучший вариант (2).
Теперь у Вас есть проблема в этом, Вы определяете значения, которые не представляют склоненные имена экземпляра в Java (а именно, использующий дефис). Таким образом, Ваш выбор:
я сделал бы их в том порядке (сначала для длительности) как порядок предпочтения.
Кто-то предложил преобразователь Oracle TopLink, но Вы, вероятно, используете Основы Toplink, будучи ссылочной реализацией JPA 1.0, которая является подмножеством коммерческого продукта Oracle Toplink.
Как другое предложение, я настоятельно рекомендовал бы переключиться на EclipseLink. Это - намного больше полноценного внедрения, чем Toplink Essentials и Eclipselink будут ссылочной реализацией JPA 2.0, когда выпущено (ожидаемый JavaOne середина в следующем году).
public enum Rating {
UNRATED ( "" ),
G ( "G" ),
PG ( "PG" ),
PG13 ( "PG-13" ),
R ( "R" ),
NC17 ( "NC-17" );
private String rating;
private static Map<String, Rating> ratings = new HashMap<String, Rating>();
static {
for (Rating r : EnumSet.allOf(Rating.class)) {
ratings.put(r.toString(), r);
}
}
private static Rating getRating(String rating) {
return ratings.get(rating);
}
private Rating(String rating) {
this.rating = rating;
}
@Override
public String toString() {
return rating;
}
}
я не знаю, как сделать отображения в аннотируемой стороне TopLink вещей как бы то ни было.
я не знаю внутренности toplink, но мое образованное предположение следующее: это использует Rating.valueOf (Представьте s в виде строки), метод для отображения в другом направлении. не возможно переопределить valueOf (), таким образом, необходимо придерживаться соглашения о присвоении имен Java, для разрешения корректного valueOf метода.
public enum Rating {
UNRATED,
G,
PG,
PG_13 ,
R ,
NC_17 ;
public String getRating() {
return name().replace("_","-");;
}
}
getRating производит "человекочитаемую" оценку. обратите внимание, что "-" chanracter не позволяется в перечислимом идентификаторе.
, конечно, необходимо будет сохранить значения в DB как NC_17.
Что относительно этого
public String getRating{
return rating.toString();
}
pubic void setRating(String rating){
//parse rating string to rating enum
//JPA will use this getter to set the values when getting data from DB
}
@Transient
public Rating getRatingValue(){
return rating;
}
@Transient
public Rating setRatingValue(Rating rating){
this.rating = rating;
}
с этим Вы используете оценки в качестве Строки и на Вашем DB и на объекте, но используете перечисление для всего остального.