Я занимаюсь разработкой приложения Java, которое использует Hibernate и связано с экземпляром Oracle. Другой клиент хочет использовать то же приложение, но требует, чтобы оно работало на MS SQL Server. Я хотел бы избежать внесения изменений в существующие аннотации и вместо этого создать пакет XML-файлов, которые мы можем добавить в зависимости от среды.
Один из способов сделать это - использовать конфигурацию JPA XML для переопределения существующих аннотаций классов. Однако JPA не поддерживает универсальные генераторы, что является обязательным требованием из-за структуры нашей устаревшей базы данных. Другой способ, которым я занимаюсь, - это использовать XML-конфигурации Hibernate для переназначения целых классов и доступа к тегу generator
xml. Это решение имеет некоторые проблемы:
- Hibernate не позволяет выборочно переопределять элементы сущности
- Hibernate не позволяет повторно сопоставить тот же класс (например,
org.hibernate.AnnotationException: Use of the same entity name twice
)
Есть ли у кого-нибудь опыт переопределения аннотаций с использованием файлов конфигурации Hibernate XML или JPA - единственный путь?
Обновление с примером
В Oracle последовательности используются для генерации уникальных идентификаторов при вставке новых записей в базу данных. Идентификатор будет затем аннотирован следующим образом:
@Id
@GeneratedValue(generator="EXAMPLE_ID_GEN", strategy=GenerationType.SEQUENCE)
@SequenceGenerator(name="EXAMPLE_ID_GEN", sequenceName="SEQ_EXAMPLE_ID")
@Column(name = "EXAMPLE_ID")
public String getExampleId() {
return this.exampleId;
}
Однако в MS SQL Server отсутствует концепция последовательностей (идеологических различий). Следовательно, вы можете использовать генератор таблиц для имитации последовательностей.
@Id
@GeneratedValue(generator="EXAMPLE_ID_GEN", strategy=GenerationType.TABLE)
@TableGenerator(name="EXAMPLE_ID_GEN", tableName="SEQUENCE", valueColumnName="VALUE", pkColumnName="SEQUENCE", pkColumnValue="EXAMPLE_ID")
public String getExampleId() {
return this.exampleId;
}
Две разные конфигурации для двух разных типов баз данных. Имейте в виду, что это устаревшая база данных, и мы не собираемся переписывать наше приложение для поддержки идентификаторов SQL Server, собственного генератора идентификаторов для SQL Server (для которого также потребуется другая аннотация).
Чтобы облегчить это, я рассмотрел использование @GenericGenerator
Hibernate и указал на класс моего собственного создания, который моделирует org.hibernate.id.SequenceGenerator
(или что-то подобное), а также настраивает структуру таблицы, расширяя org.hibernate.id.TableStructure
.
Возвращаясь к моему первоначальному вопросу - возможно ли это с помощью переопределения XML?
Как я решил эту проблему
Итак, в конце концов, я обнаружил, что JPA и Hibernate не предоставляют готовую функциональность, которую я искал. Вместо этого я создал собственный генератор, который проверил диалект базы данных и соответствующим образом установил TableStructure. Изучив все варианты, я использовал аннотацию @GenericGenerator
в Hibernate. Это пример аннотации генерации идентификатора:
@Id
@GeneratedValue(generator="EXAMPLE_ID_GEN")
@GenericGenerator(name = "EXAMPLE_ID_GEN", strategy="com.my.package.CustomIdGenerator", parameters = {
@Parameter(name = "parameter_name", value="parameter_value")
})
public String getExampleId() {
return this.exampleId;
}
Это решение требует, чтобы каждая сущность Hibernate была модифицирована с помощью нового генератора Id.