JPA има ли нещо като хибернация „@GenericGenerator“ за генериране на персонализирани идентификатори?

Опитвам се да създам персонализиран начин за изчисление и предаване на уникални идентификатори, които следват моя собствен модел.

Hibernate има анотацията @GenericGenerator, която ви позволява да картографирате персонализиран клас за изчисляване на уникален идентификатор и присвояването му обратно на колоната @Id.

пример

  @Id 
  @GeneratedValue(generator="MyIdGenerator")
  @GenericGenerator(name="MyIdGenerator", strategy="com.test.MyIdGenerator")

Работата е там, че не искам да използвам (хибернира) @GenericGenerator на ниво пакет. Може ли това да бъде в "чист" JPA / 2?

Благодаря за отделеното време.


person Dimman    schedule 18.09.2011    source източник


Отговори (2)


Не, няма. Единствената възможност без трета страна е да присвоите стойност сами. Ако искате да се предпазите от метод за извикване, който задава id, тогава може да се използва например обратно извикване на Prepersist.

  @PrePersist
  public void ensureId() {
    id = ...
  }
person Mikko Maunu    schedule 18.09.2011
comment
Наистина много елегантно решение. Наистина ли е позволено? спецификацията е двусмислена, когато гласи: Като цяло, методът на жизнения цикъл на преносимо приложение не трябва да извиква EntityManager или операции на заявки, да осъществява достъп до други екземпляри на обект или да променя връзки в рамките на същия контекст на постоянство [46]. [47] Методът за обратно извикване на жизнения цикъл може да промени състоянието на липса на връзка на обекта, на който е извикан. - person Carlo Pellegrini; 19.01.2016

Ако използвате EclipseLink, можете да дефинирате свой собствен потребителски обект Sequence.

http://wiki.eclipse.org/EclipseLink/Examples/JPA/CustomSequencing

JPA 2.0 не дефинира персонализиран генератор на последователности, но JPA 2.1 дефинира API за конвертор, който може да бъде полезен.

person James    schedule 25.03.2013
comment
Конверторът не може да се използва за идентификатор - person Marx; 21.09.2018
comment
Това е въпросът, който задавам. Обектът на последователността на EclipseLink може да е отговорът за мен, тогава stackoverflow.com/questions/57613929/ - person nettie; 22.08.2019