Перенос Hibernate в JPA без аннотаций - PullRequest
7 голосов
/ 02 августа 2011

У меня есть большой проект веб-приложения, основанный не на Java, а на JSF. Наша система является многоуровневой (в смысле исходного кода): есть пакет модели данных, основанный на пакете DAO. Мы используем отображение конфигурации XML Hibernate исключительно в пакете DAO. Мы действительно не хотим путать модель данных с аннотациями, но специально не привязаны к Hibernate (за исключением того, что отображение довольно сложное).

Я настоятельно рекомендую перейти к Java EE и построить наши объекты DAO как EJB. Но поскольку мы не хотим отказываться от XML Hibernate, это приводит меня к нескольким вопросам:

  • Можно ли использовать Hibernate с JPA без аннотаций JPA на модели?
  • Если нет, то могут ли мои EJB вести себя транзакционно с Hibernate? Я думаю, что это называется поддержкой JTA, но не уверен. Мне нравится идея получения транзакций "бесплатно"; сейчас у нас есть пользовательский обработчик фазы, который я хотел бы удалить, который обрабатывает транзакции Hibernate.
  • Существует ли способ перехода от конфигурации отображения XML Hibernate к отображению JPA XML? Я не вижу способа сделать это, но, очевидно, было бы лучше уменьшить нашу связь с Hibernate.

Спасибо!

Ответы [ 2 ]

8 голосов
/ 02 августа 2011

Можно ли использовать Hibernate с JPA без аннотаций JPA на модели?

Да, это вполне возможно. Вы можете указать все соответствующие атрибуты классов вашей объектной модели в стандартном файле отображения JPA - orm.xml. Вы также можете иметь свои собственные файлы сопоставления, но вам нужно будет указать их в persistence.xml.

Если нет, то могут ли мои EJB вести себя транзакционно с Hibernate? Я думаю, что это называется поддержкой JTA, но не уверен.

Если вы используете EJB, вы найдете транзакции, управляемые контейнером, весьма полезными. Все, что вам нужно сделать, это аннотировать ваши EJB-компоненты с необходимыми аннотациями @TransactionManagement и @TransactionAttribute, и контейнер будет автоматически управлять транзакциями для вас, включая фиксацию транзакции на конец метода (если применимо) и откат транзакции в случае исключения времени выполнения или исключения приложения.

Все EntityManager экземпляров, то есть все контексты персистентности, введенные в такие EJB, будут автоматически связаны с базовой транзакцией JTA. Обратите внимание, что это верно только в том случае, если вы разрешите контейнеру внедрять EntityManager экземпляров. Если вы сами управляете контекстами персистентности (создавая их из EntityManagerFactory экземпляров), то вам, возможно, придется вызвать EntityManager.joinTransaction(), чтобы связать всю работу, выполненную в контексте персистентности, с основная транзакция JTA. Это необходимо, поскольку EntityManager обычно ассоциируется с базовой транзакцией JTA, если вы настроили постоянный контекст для использования источников данных JTA. Если JTA-транзакция не существует, такая ассоциация не будет возникать, и поэтому вам придется присоединиться к активному JTA-переходу, если вы хотите сбросить изменения в базу данных.

Есть ли способ перехода от конфигурации отображения XML Hibernate к некоторому отображению XML JPA?

Я не знаю ни о каком таком инструменте, так как мне никогда не приходилось переносить проект, но это не значит, что нет никого, который мог бы служить этой цели. Возможно, вы захотите взглянуть на проект Hibernate Tools , который поддерживает JPA, хотя я не уверен, позволит ли он вам конвертировать из формата Hibernate XML в формат JPA.

3 голосов
/ 02 августа 2011

Да, JPA также поддерживает сопоставления XML. Помимо стандартного persistence.xml, у вас есть orm.xml и другие xml-файлы, объявляющие объекты в соответствии с XML-схемой JPA. Вот ссылка .

Что касается транзакционных EJB - да, они могут быть транзакционными (с аннотациями JPA в модели или без них)

...