Чтение ENUM и его полей из базы данных (JPA) - PullRequest
1 голос
/ 08 апреля 2011

У меня есть объект модели, который фактически является перечислением с полями и геттерами:

@Entity
public enum Type {
   TYPE1, TYPE2, TYPE3, TYPE4;

   @Column
   private Long id;
   @Column
   private String name;
   ...

   public String getName() {
      return this.name;
   }
   ...
}

Он компилируется и работает нормально.Однако, если я вызываю метод получения, он возвращает ноль (не загружает никаких значений, хранящихся в базе данных).Это стандартное поведение?Есть ли способ заставить JPA загрузить их?

Ответы [ 3 ]

3 голосов
/ 12 апреля 2011

Я бы сказал, что в этом подходе есть неверное представление:

  1. Сущности представляют объекты, которые могут храниться в базе данных.В этом случае база данных (или любое другое постоянное хранилище) определяет, какие экземпляры доступны.

  2. Перечисления представляют собой фиксированный набор констант, определенных в исходном коде.Таким образом, сам класс определяет, какие константы доступны.Кроме того, в общем случае плохой практикой является изменение значений перечисления, т. Е. Имени или идентификатора в вашем случае.

Вы видите, что это два совершенно разных понятия, к которым следует относиться по-разному.

Чтобы хранить перечисления в сущностях (где перечисление является полем этой сущности), вы можете использовать @Enumerated и сохранить имя или порядковый номер перечисления, или (что мы делаем чаще)одно из полей (мы в основном используем id) и предоставляем методы преобразования.

Если вы хотите сохранить настраиваемые «константы» в базе данных, вы можете попробовать использовать для этого простые сущности, сделайте конструктор закрытым (Hibernate)и другие провайдеры JPA должны иметь возможность справиться с этим) и предоставить альтернативную реализацию класса Enum (хотя вы не можете использовать ключевое слово enum).

1 голос
/ 11 апреля 2011

Вы смотрели аннотацию @Enumerated? Я никогда не пытался использовать его внутри самого перечисления, однако он работает достаточно хорошо, связывая свойство класса с перечислением.

enum Type{TYPE1, TYPE2}

@Column(name="type")
@Enumerated(EnumType.STRING)
public Type getType(){return type;}
public void setType(Type t){type = t;}
0 голосов
/ 08 апреля 2011

Если JPA не может быть обработан, вы можете добавить метод public Type valueOf(long id) к вашему классу enum, который вы используете в качестве фабрики для создания экземпляров enum, представляющих значения в вашей прежней таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...