Я разрабатываю Java-приложение, которое использует Hibernate и связано с экземпляром Oracle. Другой клиент хочет использовать одно и то же приложение, но требует его запуска на MS SQL Server. Я хотел бы избежать внесения изменений в существующие аннотации и вместо этого создать пакет xml файлов, которые мы можем удалить в зависимости от среды.
Один из способов сделать это - использовать конфигурацию JPA XML для переопределения существующих аннотаций классов. Однако JPA не поддерживает генераторные генераторы, что является требованием из-за структуры нашей старой базы данных. Другой способ, которым я занимаюсь, - использовать Hibernate XML configs для переназначения целых классов и доступа к тегу 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 (для чего также потребуется другая аннотация).
Чтобы облегчить это, я рассмотрел использование Hibernate @GenericGenerator
и назовет его классу собственного создания, которое моделирует org.hibernate.id.SequenceGenerator
(или что-то подобное), а также настраивает структуру таблицы, расширяя org.hibernate.id.TableStructure
.
Вернуться к исходному вопросу - возможно ли это с помощью переопределения XML?
Как я решил эту проблему
Итак, в конце концов, я обнаружил, что JPA и Hibernate не предоставляют функциональные возможности, которые я искал. Вместо этого я создал специальный генератор, который проверил диалоги базы данных и соответствующим образом установил TableStructure. Когда я изучил все варианты, я закончил использование аннотации Hibernate @GenericGenerator
. Это пример аннотации генерации Id:
@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.