Могу ли я сопоставить EnumSet с рядом логических столбцов, автоматически используя аннотации Hibernate? - PullRequest
4 голосов
/ 05 марта 2009

У меня есть EnumSet, который, как я думал, было бы хорошо отобразить в серию логических столбцов. Это облегчит проверку с помощью инструментов SQL, а также будет устойчивым к изменениям в доступных значениях перечисления. Однако я не очень хочу писать для этого все геттеры и сеттеры.

У кого-нибудь есть умное решение, использующее какие-то метаданные гибернации для разделения этого объекта на набор свойств?

Спасибо!

1 Ответ

1 голос
/ 09 марта 2009

Если я вас правильно понимаю, для перечисления вроде:

public enum Color { RED, GREEN, BLUE; }

в базе данных будет 3 столбца true / false, по одному на каждое возможное значение enum. Затем EnumSet, содержащий, скажем, КРАСНЫЙ и СИНИЙ, должен быть сопоставлен с:

RED    GREEN    BLUE
true   false    true

Если это так, единственный известный мне способ - написать собственную реализацию org.hibernate.usertype.UserType. Это довольно простая задача, с некоторыми примерами, доступными на сайте Hibernate, и, например, здесь .

Редактировать : Я просто понял, что все должно быть несколько сложнее. Если вы хотите, чтобы в вашем приложении было одно отображение типов Hibernate для всех возможных EnumSet, вам нужно будет сделать следующее:

  1. Используйте org.hibernate.usertype.ParameterizedType и сделайте параметризацию пользовательского типа классом enum.
  2. В зависимости от значений класса enum определите, сколько и какие столбцы нужно читать / записывать.
  3. Использовать тип каждый раз, когда используется EnumSet.
  4. Рассмотрим возможность отображения нескольких наборов в одной таблице, а также то, как добавление нового значения enum повлияет на работу существующего типа.

Это может легко составить полный рабочий день, но кажется вполне выполнимым. Надеюсь, вы это выясните отсюда.

...