Hibernate @SequenceGenerator не является глобальным

У меня есть два класса сущностей, которые используют сгенерированные значения

@Entity
@SequenceGenerator(allocationSize = 1, initialValue = 1000, name = "idgen")
public class Ent1 {
    @Id
    @GeneratedValue(generator = "idgen")
    private Long id;

    ...
}

@Entity
public class Ent2 {
    @Id
    @GeneratedValue(generator = "idgen")
    private Long id;

    ...
}

Проблема в том, что если не поставить линию

@SequenceGenerator(allocationSize = 1, initialValue = 1000, name = "idgen")

на обеих сущностях я получаю ошибку:

Caused by: org.hibernate.AnnotationException: Unknown Id.generator: idgen

Но спецификация JPA гласит, что область действия @SequenceGenerator является "глобальной" и может быть повторно использована всеми сущностями.

Что мне не хватает?

4 ответа

В прошлом Hibernate ограничивал последовательность последовательностей для каждой сущности, а затем пришел JPA, говорящий, что это должно быть глобальным, поэтому, чтобы разрешить и то, и другое, была введена настройка для управления этим. Вы можете включить глобальную область видимости, установив hibernate.jpa.compliance.global_id_generators к true. Также см. Документацию о деталях: https://docs.jboss.org/hibernate/orm/5.5/userguide/html_single/Hibernate_User_Guide.html#configurations-jpa-compliance

Похоже, что это ошибка в реализации Hibernate JPA, потому что она работает так, как вы ожидаете от реализации EclipseLink JPA (я тестировал оба). С Hibernate это работало, только если я объявил SequenceGenerator на уровне приложения, используя orm.xml (при условии, что вы используете JPA EntityManager). Если у вас еще нет orm.xml, он идет рядом с вашим persistence.xml.

Вот пример объявления генератора последовательности в файле orm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings
  xmlns="http://java.sun.com/xml/ns/persistence/orm"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
  version="2.0">

  <sequence-generator name="idgen" allocation-size="1" initial-value="1000" />

</entity-mappings>

Тогда вам не нужно объявлять SequenceGenerator в каждом классе.

Копировать

@SequenceGenerator(allocationSize = 1, initialValue = 1000, name = "idgen")

чтобы Ent2 работал,
вы можете обратиться к https://www.logicbig.com/tutorials/java-ee-tutorial/jpa/seq-generator.html для получения более подробной информации

Следующая часть спецификации действительно странная для меня.

Область имени генератора является глобальной для единицы сохраняемости (для всех типов генераторов).

Я бы интерпретировал это так, как вы: генератор может быть задан в одном месте и повторно использован в любом месте в одной и той же персистентной единице. Как будто текущая реализация Hibernate не приняла это предложение во внимание.

Есть ли специалист по спецификации JPA/Hibernate, который мог бы помочь интерпретировать это предложение?

Другие вопросы по тегам