JPA @TableGenerator совместно используется несколькими объектами - PullRequest
6 голосов
/ 30 апреля 2010

У меня есть 'собака' 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) в другом объекте? Я хочу сохранить одинаковую последовательность идентификаторов в двух независимых сущностях, скажем

собака = 1, собака = 2, собака = 3, кот = 4, кот = 5, собака = 6 и так далее ...

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

Если я добавлю @ GeneratedValue (generator = "dog_gen") на мою сущность cat, пропущенное объявление @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) 

1 Ответ

3 голосов
/ 30 апреля 2010

Действительно, и это не то, что я ожидал после прочтения 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...