TL; DR : Каким образом JPA реализует пользовательский TableGenerator для сущностей?
В настоящее время у нас есть одна база данных MySQL, которая была изначально сгенерирована (и с тех пор изменена) с использованием EclipseLink.
Однако недавно мы решили реализовать приложение Spring Boot, которое обращается к базе данных, и Hibernate был выбран в качестве поставщика сохраняемости.
Первичные ключи (идентификаторы) сущностей генерируются следующим образом (на примере Host.java
):
@Id
@TableGenerator(name = "Host.id", schema = "schema", table = "SEQUENCE", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "Host.id")
@GeneratedValue(generator = "Host.id", strategy = GenerationType.TABLE)
protected Long id;
Проблема, с которой мы сталкиваемся, заключается в том, что алгоритм, генерирующий идентификаторы для вновь создаваемых объектов, отличается между EclipseLink и Hibernate. До этого момента мне удавалось использовать следующие настройки Hibernate (persistence.xml
), чтобы почти получал желаемый результат:
<property name="hibernate.id.new_generator_mappings" value="true"></property>
<property name="hibernate.id.optimizer.pooled.prefer_lo" value="true"></property>
Однако в двух реализациях JPA используются разные алгоритмы для генерации идентификаторов, что вызывает конфликты при одновременном использовании обеих реализаций.
Мне известна аннотация Hibernate @GenericGeneration
, которая позволяет указать генератору пользовательскую реализацию IdentifierGenerator
, но затем мы должны включить зависимости Hibernate в наш проект "модель данных" (который является JPA реализация независимая).
Есть ли способ изменить нашу сущность таким образом, чтобы EclipseLink и Hibernate использовали одну и ту же реализацию генератора идентификаторов? Желательно без переопределения аннотаций с файлом .xml
.
Ссылки: