Как использовать перечисления с JPA

35
задан Buhake Sindi 28 January 2015 в 11:22
поделиться

6 ответов

Кажется, что необходимо добавить поддержку пользовательского типа:

Расширяющийся OracleAS TopLink для Поддержки Пользовательских Преобразований типов

8
ответ дан blahdiblah 27 November 2019 в 07:00
поделиться

Вы попытались сохранить порядковый номер. Хранилище строковое значение хорошо работает, если у Вас нет связанной Строки к значению:

@Enumerated(EnumType.ORDINAL)
31
ответ дан aledbf 27 November 2019 в 07:00
поделиться

У Вас есть проблема здесь, и это - ограниченные возможности JPA когда дело доходит до обработки перечислений. С перечислениями у Вас есть два варианта:

  1. Хранят их как число, равняющееся Enum.ordinal(), который является ужасной идеей (по моему скромному мнению); или
  2. Хранят их как строку, равняющуюся Enum.name(). Примечание: не toString(), как Вы могли бы ожидать, тем более, что behaviourfor Enum.toString() по умолчанию должен возвратиться name().

Лично я думаю, что наилучший вариант (2).

Теперь у Вас есть проблема в этом, Вы определяете значения, которые не представляют склоненные имена экземпляра в Java (а именно, использующий дефис). Таким образом, Ваш выбор:

  • Изменение Ваши данные;
  • поля Persist String и неявно преобразовывают их в или от перечислений в Ваших объектах; или
  • Использование нестандартные расширения как TypeConverters.

я сделал бы их в том порядке (сначала для длительности) как порядок предпочтения.

Кто-то предложил преобразователь Oracle TopLink, но Вы, вероятно, используете Основы Toplink, будучи ссылочной реализацией JPA 1.0, которая является подмножеством коммерческого продукта Oracle Toplink.

Как другое предложение, я настоятельно рекомендовал бы переключиться на EclipseLink. Это - намного больше полноценного внедрения, чем Toplink Essentials и Eclipselink будут ссылочной реализацией JPA 2.0, когда выпущено (ожидаемый JavaOne середина в следующем году).

25
ответ дан cletus 27 November 2019 в 07:00
поделиться
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 вещей как бы то ни было.

5
ответ дан JeeBee 27 November 2019 в 07:00
поделиться

я не знаю внутренности 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.

2
ответ дан Andreas Petersson 27 November 2019 в 07:00
поделиться

Что относительно этого

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 и на объекте, но используете перечисление для всего остального.

0
ответ дан Mg. 27 November 2019 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: