У меня есть 'собака' 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)
В самом деле, это не то, что я ожидал, прочитав 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;