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
Что мне не хватает?
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, который мог бы помочь интерпретировать это предложение?