JPA SequenceGenerator и GeneratedValue: имя / свойство генератора уникально только для каждого класса?

Я использую JPA + OpenJPA с PostgreSQL в качестве серверной СУБД. Первичные ключи моих таблиц обычно состоят из столбца SERIAL / BIGSERIAL. Таким образом, PostgreSQL автоматически генерирует идентификаторы для новых записей (strategy=GenerationType.IDENTITY).

Аннотации свойства ID выглядят так:

@Id
@SequenceGenerator(name="myseq",sequenceName="foobartable_fooid_seq")
@GeneratedValue(generator="myseq",strategy=GenerationType.IDENTITY)

Мой вопрос: могу ли я скопировать и вставить этот блок аннотаций в несколько объектов, изменяя только значение sequenceName? sequenceName отличается от стола к столу. Но может ли SequenceGenerator всех сущностей называться myseq или что-то в этом роде? Или нужно указать уникальное имя генератора для SequenceGenerator каждой сущности? Так что каждое имя SequenceGenerator должно быть уникальным в единице сохранения?

Возможно, стоит использовать то же значение, что и для sequenceName в базе данных? Чтобы написать что-нибудь вроде

@Id
@SequenceGenerator(name="foobartable_fooid_seq",sequenceName="foobartable_fooid_seq")
@GeneratedValue(generator="foobartable_fooid_seq",strategy=GenerationType.IDENTITY)

Любые рекомендации о том, как назвать SequenceGenerators?

Большое спасибо за любые предложения!

Ваш, мистер Снруб


person MrSnrub    schedule 07.02.2013    source источник
comment
Прежде всего, если вы используете генератор последовательности, вы не используете стратегию IDENTITY (которая будет заключаться в использовании столбца с автоматическим приращением, как в MySQL). В остальном, почему бы вам просто не сделать это и посмотреть, что произойдет? Или вы также можете прочитать javadoc SequenceGenerator, в котором говорится: Область действия имени генератора глобальна для единицы сохраняемости (для всех типов генераторов).   -  person JB Nizet    schedule 08.02.2013


Ответы (1)


В Javadoc для SequenceGenerator я делаю акцент:

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

Таким образом, вы захотите использовать уникальное имя для каждой последовательности, определенной в единице сохранения состояния. С другой стороны, ваша GeneratedValue стратегия должна быть SEQUENCE, как указано в комментарии выше.

person Perception    schedule 07.02.2013
comment
Большое спасибо за быстрый ответ! Есть ли недостатки в использовании того же имени, которое также используется в базе данных для последовательности, что означает, что name равно sequenceName? - person MrSnrub; 08.02.2013
comment
Что касается стратегии: PostgreSQL создает неявную последовательность для столбцов с типом SERIAL. Это несколько странная повязка Postgres на MySQL auto_increment. Я предполагаю, что IDENTITY верен, поскольку несколько страниц / примеров используют его таким образом со специальным способом Postgres для автоматического увеличения. - person MrSnrub; 08.02.2013
comment
Я не вижу никаких доводов в пользу использования того же имени, которое вы определили в БД, поскольку имена последовательностей должны быть разными в PostgreSQL. Во всяком случае, это упрощает вашу жизнь. - person Perception; 08.02.2013