JPA @TableGenerator совместно используется несколькими объектами

У меня есть 'собака' Entitiy с @Id и @TableGenerator

...
@TableGenerator(table = "seq", name = "dog_gen", pkColumnName = "seq_name", valueColumnName="seq_val")
@Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "dog_gen")
private Long id;
...

Существует ли способ снова использовать тот же генератор таблиц (dog_gen) в другом объекте? Я хочу сохранить ту же идентификационную последовательность в двух независимой сущности, сказать

dog=1, dog=2, dog=3, cat=4, cat=5, dog=6 и так далее...

Оба объекта не совместно используют общий суперкласс для реализации некоторого наследования с идентификационным свойством.

Если я добавляю, что @GeneratedValue (генератор = "dog_gen") на моем объекте кошки, опуская @TableGenerator объявление выдает Исключение, говоря, что это не может найти генератор при запуске контекста.

Caused by: org.hibernate.AnnotationException: Unknown Id.generator: dog_gen
at org.hibernate.cfg.BinderHelper.makeIdGenerator(BinderHelper.java:413)
at org.hibernate.cfg.AnnotationBinder.bindId(AnnotationBinder.java:1795)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1229)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:733)
at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:498)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:277) 
6
задан Pascal Thivent 30 April 2010 в 04:01
поделиться

1 ответ

В самом деле, это не то, что я ожидал, прочитав javadoc @TableGenerator :

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

Возможно, я неправильно интерпретирую вещи (раздел 9.1.38 спецификации JPA не говорит нам больше), но я ожидал, что смогу сослаться на имя генератора из другой сущности в @GeneratedValue .

В любом случае, похоже, работает следующее. В сущности Dog :

@TableGenerator(table = "myseq", name = "dog_gen", pkColumnName = "seq_name", 
      valueColumnName = "seq_val", pkColumnValue = "Dog", allocationSize = 1)
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "dog_gen")
private Long id;

И в Cat , ну то же самое:

@TableGenerator(table = "myseq", name = "dog_gen", pkColumnName = "seq_name", 
      valueColumnName = "seq_val", pkColumnValue = "Dog", allocationSize = 1)
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "dog_gen")
private Long id;
3
ответ дан 17 December 2019 в 18:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: