2015-11-28 3 views
0

Я пытаюсь сохранить некоторые enum s в Hibernate, и похоже, что мои два варианта встроенной поддержки - использовать имя перечисления, которое я бы предпочел не делать, потому что это строка основанный вместо int на основе или порядковый номер перечисления, который я бы предпочел не делать, потому что, если я добавлю одно из значений enum в начале класса позже, я сломаю все по строке.Как добавить свой собственный EnumValueMapperSupport

Вместо этого у меня есть интерфейс под названием Identifiable, который содержит public int getId() как часть его контракта. Таким образом, перечисления, которые я хочу сохранить, могут реализовать Identifable, и я могу знать, что они будут определять свой собственный идентификатор.

Но когда я пытаюсь расширить EnumValueMapperSupport, поэтому я могу использовать эту функциональность, меня приветствуют ошибки от компилятора, потому что интерфейс EnumValueMapper и класс EnumValueMapperSupport не являются статическими и, как ожидается, будут заблокированы в заданный EnumType объект.

Как можно расширить эту функциональность в спящем режиме, не переписывая кучу спящего кода и отправляя патч. Если я не могу, есть ли другой способ как-то сохранить перечисление на основе чего-то другого, кроме порядкового номера или имени, а вместо этого на свой собственный код?

В связи с мыслью, кто-то лично был по этому пути и решил «давайте посмотрим, как плохое отображение имен», и просто пошел с картографированием имен, потому что это было не намного хуже. Как, возможно, я преждевременно оптимизирую здесь?

Я работаю против версии спящего режима 5.0.2-final.

+0

Есть m ай вопросы по этой теме. Недавно был [String Enum on Hibernate] (http://stackoverflow.com/questions/33895184/string-enum-on-hibernate), высокий голос был проголосован: [Можно ли написать общий конвертер enum для JPA ] (http://stackoverflow.com/questions/23564506) –

+0

Есть много вопросов по этой теме. На прошлой неделе я прочитал многие из них. Я использовал их в своей текущей кодовой базе, чтобы попытаться приблизиться к тому, что я хочу. То, что я не вижу, - это то, что позволяет мне определять свой собственный EnumValueMapper, поэтому для будущих разработчиков совершенно очевидно, что это перечисление вместо обычного старого типа. Где прямо сейчас я могу (и делать) использовать 'Enumerated (EnumType.STRING)' – corsiKa

+0

Извините, но я сосредоточился на вашей второй части (здесь есть другой способ как-то сохранить enum_), потому что для меня это, кажется, прекрасно отвечает связанные вопросы. Если у вас есть интерфейс «Идентифицируемый», напишите «IdentifiableAttributeConverter». Если я все еще не понимаю: не могли бы вы добавить пример для вашего Идентифицируемого? Особенно для его использования, поскольку вы не можете одновременно объявлять «Enum» и «Identifiable» для одного объекта. Теперь в первую часть: «EnumValueMapper» _is_ static (но частный), и вы всегда можете расширять 'EnumValueMapperSupport' в расширении' EnumType'. –

ответ

0

По крайней мере, для спящего режима 4.3.5 EnumValueMapperявляется статическим - хотя и частным.

Но вы можете расширить EnumValueMapperSupport в расширении EnumType:

public class ExampleEnumType extends EnumType { 

    public class ExampleMapper extends EnumValueMapperSupport { 
     ... 
    } 

} 

Чтобы создать экземпляр этого картографа вам нужен экземпляр вашего EnumType:

ExampleEnumType type = new ExampleEnumType(); 
ExampleMapper mapper = type.new ExampleMapper(); 

Или вы создаете его внутри тип:

public class ExampleEnumType extends EnumType { 

    public class ExampleMapper extends EnumValueMapperSupport { 
     ... 
    } 

    public ExampleMapper createMapper() { 
     return new ExampleMapper(); 
    } 
} 
+0

Я сейчас работаю против 5.0.2 финала. Я бы не ожидал такого рода сдвиг между версиями. – corsiKa

+0

Но расширение «EnumValueMapperSupport» возможно для Hibernate 5. –

+0

@corsiKa Помогло ли это? У меня такое чувство, что мой текущий ответ - только половина того, что вам нужно. И я действительно хотел бы закончить его, если вы дадите мне несколько намеков ... –

Смежные вопросы