Я разрабатываю JAVA-приложение, которое В спящем режиме использование, и подключен к экземпляру Oracle. Другой клиент надеется использовать то же приложение, но требует, чтобы оно работало на SQL Server MS. Я хотел бы постараться не внести изменения в существующие аннотации и вместо этого создавать пакет XML-файлов, которым мы можем заглядывать в зависимости от среды.
Один способ сделать это использует конфигурацию XML JPA для переопределения существующих аннотаций класса. Однако JPA не поддерживает универсальные генераторы, который является требованием из-за структуры нашей унаследованной базы данных. Другой способ, которым я изучаю, состоит в том, чтобы использовать, в спящем режиме конфигурации XML, чтобы повторно отобразить все классы и иметь доступ к generator
тег XML. Это решение имеет некоторые проблемы хотя:
org.hibernate.AnnotationException: Use of the same entity name twice
)У кого-либо есть опыт с переопределяющим использованием аннотаций, в спящем режиме, Конфигурационные 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;
}
Однако SQL Server MS не имеет понятия Последовательностей (Идеологические разногласия). Поэтому Вы могли использовать генератор таблиц для моделирования последовательностей.
@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 и В спящем режиме, не обеспечил функциональность из поля, которую я искал. Вместо этого я создал пользовательский генератор, который проверил диалект базы данных и установил TableStructure соответственно. Когда я исследовал все опции, я закончил тем, что использовал Hibernate @GenericGenerator
аннотация. Это - пример идентификационной аннотации поколения:
@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;
}
Это решение требует этого, каждый В спящем режиме объект быть измененным с новым идентификационным генератором.
Я думаю, что если вы не используете AnnotationConfiguration
при настройке SessionFactory
, аннотации будут опущены.
Поэтому используйте Configuration
.
Для проблемы с генератором (решение которой обычно будет «использовать собственный генератор», но не работает для вас из-за работы с устаревшей базой данных), вы, вероятно, могли бы расширить SQLServerDialect и переопределите getNativeIdentifierGeneratorClass, чтобы вернуть (возможно, настраиваемый) генератор, который делает то, что вам нужно для вашей устаревшей базы данных.
Я столкнулся с необходимостью смешивать устаревшее сочетание с новыми схемами / базами данных раньше в приложении Grails (GORM), которое, конечно, запускает Hibernate 3 под ним.
Я бы не сказал «вы делаете это неправильно», но я бы оставил JPA @Annotations на основе самых основ, таких как @Entity и @Column, и оставил бы его диалекту Hibernate , который также является указанный в файле конфигурации XML.
Вы можете поэкспериментировать с подклассом Oracle10gDialect, который назначает генератор последовательностей всем таблицам, в отличие от Sybase, который этого не делает.
См. Этот пост о том, как это реализовать.
ОБНОВЛЕНИЕ: Мы с Джеймсом предлагаем (почти в одну и ту же минуту) настроить несколько разделов единиц сохранения в вашем файле persistence.xml.
Это позволяет использовать @Entity и @Id без указания деталей в классе. Подробности содержатся в свойстве hibernate.dialect
. Я предложил создать подкласс Oracle10gDialect (и SQLServerDialect) - они будут делать выбор в отношении именования таблиц, стратегии генератора идентификаторов и т. Д.
См. -> https://forum.hibernate.org/viewtopic. php? f = 1 & t = 993012
Я бы сказал, что если ваши аннотации относятся к базе данных, вы делаете это неправильно.
Если вы переписываете аннотации в файлах HBM XML, вы можете поддерживать два набора таких XML и выбирать, какие из них использовать, с помощью директив отображения Hibernate. Я сделал это в Hibernate Core, но не в среде J2EE / JPA, поэтому я не знаю, есть ли какие-то подводные камни в этом отношении.
Самый большой недостаток заключается в том, что, вероятно, потребуется много работы, чтобы удалить все ваши аннотации и перестроить их в XML.