Реализация словаря на основе перечисления в JPA 2 - PullRequest
6 голосов
/ 18 ноября 2011

Предположим, у меня есть словарь (т.е. пол: MALE, FEMALE), используемый в моем приложении.

Я бы хотел использовать этот словарь как Java enum.Более того, на значения этого словаря ссылаются из множества других таблиц, так что вы хотели бы иметь отдельную таблицу 1005 *.

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

Как бы вы реализовали такой вариант использования?
- Создать объект Dictionary со статическим методом, производящий значения enum?
- Изменен метод получения и установки для Dictionary, который возвращает enum вместо Dictionary экземпляра?
- ... или, возможно, вам никогда не требовалось сохранять enum в отдельной таблице?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2015

Этого можно достичь с помощью этого подхода.

1.Перечислите, где вы можете хранить ID

public enum Gender{
 MALE(1L),
 FEMALE(2L);

private final Long id;

Gender(Long id) {
   this.id= id;
}

public Long getId(){
   return id;
}

2.Относится к этому перечислению отдельная сущность

public class RefGenderEntity {
    private Long id;
    private String value;
    ......
}

3.Посмотрите на EntityManager # findById

MyObjectThatStoreIdForGender val = ...... ;
RefGenderEntity gender = em.find(RefGenderEntity.class, val.getGenderId());

Конечно, таблицу RefGenderEntity теперь можно предварительно заполнить двумя значениями, и вы будете в порядке с внешними ключами и обычными обычными рабочими объединениями.

0 голосов
/ 26 июня 2012

Вы можете определить таблицу словаря, используя целочисленные значения идентификаторов, которые соответствуют порядковым номерам вашего enum.Как уже отмечали многие, это хрупко, поскольку вы не можете легко изменить ваши значения: JPA использует метод ordinal() при использовании модификатора EnumType.ORDINAL в аннотации @Enumerated.

Чуть лучше, вы можете указать EnumType.STRING и определить столбец первичного ключа таблицы словаря как VARCHAR, со значениями, равными именам значений enum.Это все еще хрупко, потому что вы больше не можете изменять свои enum имена.

Ответ на этот вопрос показывает другой вариант: придерживаться целых чисел в вашей сущности, но переводить в вашейаксессоры.

...