Переопределение в спящем режиме аннотации

Я разрабатываю 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;
}

Это решение требует этого, каждый В спящем режиме объект быть измененным с новым идентификационным генератором.

13
задан rynmrtn 12 November 2010 в 22:15
поделиться

5 ответов

Я думаю, что если вы не используете AnnotationConfiguration при настройке SessionFactory, аннотации будут опущены.

Поэтому используйте Configuration.

1
ответ дан 2 December 2019 в 02:11
поделиться

Для проблемы с генератором (решение которой обычно будет «использовать собственный генератор», но не работает для вас из-за работы с устаревшей базой данных), вы, вероятно, могли бы расширить SQLServerDialect и переопределите getNativeIdentifierGeneratorClass, чтобы вернуть (возможно, настраиваемый) генератор, который делает то, что вам нужно для вашей устаревшей базы данных.

1
ответ дан 2 December 2019 в 02:11
поделиться

Я столкнулся с необходимостью смешивать устаревшее сочетание с новыми схемами / базами данных раньше в приложении 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

1
ответ дан 2 December 2019 в 02:11
поделиться

Я бы сказал, что если ваши аннотации относятся к базе данных, вы делаете это неправильно.

0
ответ дан 2 December 2019 в 02:11
поделиться

Если вы переписываете аннотации в файлах HBM XML, вы можете поддерживать два набора таких XML и выбирать, какие из них использовать, с помощью директив отображения Hibernate. Я сделал это в Hibernate Core, но не в среде J2EE / JPA, поэтому я не знаю, есть ли какие-то подводные камни в этом отношении.

Самый большой недостаток заключается в том, что, вероятно, потребуется много работы, чтобы удалить все ваши аннотации и перестроить их в XML.

1
ответ дан 2 December 2019 в 02:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: