Я пытаюсь сохранить некоторые enum
s в Hibernate, и похоже, что мои два варианта встроенной поддержки - использовать имя перечисления, которое я бы предпочел не делать, потому что это строка основанный вместо int на основе или порядковый номер перечисления, который я бы предпочел не делать, потому что, если я добавлю одно из значений enum в начале класса позже, я сломаю все по строке.Как добавить свой собственный EnumValueMapperSupport
Вместо этого у меня есть интерфейс под названием Identifiable
, который содержит public int getId()
как часть его контракта. Таким образом, перечисления, которые я хочу сохранить, могут реализовать Identifable
, и я могу знать, что они будут определять свой собственный идентификатор.
Но когда я пытаюсь расширить EnumValueMapperSupport, поэтому я могу использовать эту функциональность, меня приветствуют ошибки от компилятора, потому что интерфейс EnumValueMapper и класс EnumValueMapperSupport не являются статическими и, как ожидается, будут заблокированы в заданный EnumType объект.
Как можно расширить эту функциональность в спящем режиме, не переписывая кучу спящего кода и отправляя патч. Если я не могу, есть ли другой способ как-то сохранить перечисление на основе чего-то другого, кроме порядкового номера или имени, а вместо этого на свой собственный код?
В связи с мыслью, кто-то лично был по этому пути и решил «давайте посмотрим, как плохое отображение имен», и просто пошел с картографированием имен, потому что это было не намного хуже. Как, возможно, я преждевременно оптимизирую здесь?
Я работаю против версии спящего режима 5.0.2-final.
Есть m ай вопросы по этой теме. Недавно был [String Enum on Hibernate] (http://stackoverflow.com/questions/33895184/string-enum-on-hibernate), высокий голос был проголосован: [Можно ли написать общий конвертер enum для JPA ] (http://stackoverflow.com/questions/23564506) –
Есть много вопросов по этой теме. На прошлой неделе я прочитал многие из них. Я использовал их в своей текущей кодовой базе, чтобы попытаться приблизиться к тому, что я хочу. То, что я не вижу, - это то, что позволяет мне определять свой собственный EnumValueMapper, поэтому для будущих разработчиков совершенно очевидно, что это перечисление вместо обычного старого типа. Где прямо сейчас я могу (и делать) использовать 'Enumerated (EnumType.STRING)' – corsiKa
Извините, но я сосредоточился на вашей второй части (здесь есть другой способ как-то сохранить enum_), потому что для меня это, кажется, прекрасно отвечает связанные вопросы. Если у вас есть интерфейс «Идентифицируемый», напишите «IdentifiableAttributeConverter». Если я все еще не понимаю: не могли бы вы добавить пример для вашего Идентифицируемого? Особенно для его использования, поскольку вы не можете одновременно объявлять «Enum» и «Identifiable» для одного объекта. Теперь в первую часть: «EnumValueMapper» _is_ static (но частный), и вы всегда можете расширять 'EnumValueMapperSupport' в расширении' EnumType'. –