Spring-WS и Straight-JPA (EclipseLink) Конфигурирование и развертывание - PullRequest
2 голосов
/ 08 октября 2010

Я реализовал веб-сервис EJB3 / JPA без каких-либо серьезных проблем, и теперь я перешел на веб-сервис Spring-WS / JPA.Оба развертываются в Glassfish.

Мое понимание JPA ограничено, но по умолчанию транзакции управляются контейнером?Как вы измените это?С EJB3 все было просто, так как я мог просто вставить EntityManager в «DAO» (обсуждение в другой раз!) С помощью @PersistentContext, и контейнер позаботился бы о разграничении транзакций.С точки зрения базовой конфигурации, вот и все.Поскольку контейнер использует JTA, я указал тип транзакции "JTA" в модуле постоянства.В моем очень простом примере приложения с одним постоянным модулем мне не нужно заботиться о его названии. Ситуация усложняется, если у вас есть несколько постоянных модулей или контейнер позаботится об этом?

Теперь у меня естьпостроил равноценный веб-сервис с Spring-WS и повторно использовал мои сущности / дао, но я изо всех сил пытался заставить его работать.Я включил в контекст своего приложения определение компонента для EntityManagerFactory (LocalContainerEntityManagerFactoryBean), а также для JpaTransationManager (ссылка на EntityManagerFactory).Я также включил пространство имен PersistenceAnnotationBeanPostProcessor и tx.Я бы не подумал, что мне нужно делать что-то еще, но он не будет развертываться с Нет доступных поставщиков персистентности для ошибки "null" .

Нужно ли указывать фактическое сохранениеединица, для которой я хочу создать менеджера?

Спасибо,

Обновление:

Хорошо, я получаю следующую ошибку: javax.persistence.PersistenceException: Нет поставщика постоянствадля EntityManager с именем null.

Это, вероятно, моя весенняя конфигурация для фабрики / менеджера:

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManager" />

<bean
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

<tx:annotation-driven/>

Я думаю, что мне может понадобиться или добавить что-то еще в нее ...

Еще одно обновление:

Исправлена ​​эта проблема - Использовал LocalEntityManager вместо LocalContainerEntityManager.

Теперь у меня проблемы с сохранением моих объектов.У меня есть родительский объект с дочерним объектом в качестве свойства.Я вижу, что дочерний объект сохраняется в журналах, когда я вызываю em.persist(parent), но родительский объект не сохраняется.

Последнее обновление:

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

1 Ответ

0 голосов
/ 09 октября 2010

Мое понимание JPA ограничено, но по умолчанию транзакции управляются контейнером?

В среде Java EE тип диспетчера сущностей по умолчанию для сессионного компонента - контейнер и в области транзакций .

Как это изменить?

Изменить что именно?И в каком контексте?В среде Java EE вам придется использовать сессионный компонент Bean Managed Transaction (BMT) и управлять UserTransaction.

Ситуация усложняется, если у вас несколько единиц персистентности или будетконтейнер позаботится об этом?

Я не уверен в этом, он может быть специфичным для контейнера.Поэтому, если у вас есть несколько единиц персистентности, я бы посоветовал определить unitName.

. Теперь я создал эквивалентный веб-сервис с Spring-WS (...).указать фактическую единицу сохраняемости, для которой я хочу создать менеджера?

Это не требуется.В этой статье приведена хорошая сводка механизмов по умолчанию (может быть, это также объясняется в документации, но я не смог найти что-то более краткое):

Spring's LocalContainerEntityManagerFactoryBean загружаетконфигурация модуля сохраняемости из дескриптора модуля постоянства (например, META-INF/persistence.xml), имя которого эквивалентно значению свойства persistenceUnitName, указанного для этого фабричного компонента (см. листинги 1 и 2).Если имя единицы сохраняемости не указано, выбирается первая конфигурация в дескрипторе единицы сохраняемости.Внедрение диспетчера персистентности в свойства bean-компонентов Spring, помеченных @PersistenceContext, обрабатывается специальным постпроцессором bean-компонентов, который должен быть зарегистрирован в файле конфигурации Spring, показанном в листинге 9.

(...)

Когда Spring встречает аннотацию @PersistenceContext в свойстве бина, он использует значение атрибута unitName аннотации, чтобы найти фабричный бин, производящий EntityManagerFactory, с соответствующим значением свойства persistenceUnitName., сопоставляя идентификатор бина как запасной вариант.Если атрибут unitName не указан в аннотации, то Spring использует первый фабричный компонент, создающий EntityManagerFactory, определенный в конфигурации Spring.Пример использования @PersistenceContext для вставки области транзакции EntityManager в bean-компонент Spring показан в листинге 10. (Если в вашем приложении только одна единица персистентности, вы можете безопасно отключить атрибут unitName.) (...)

Возвращаясь к вашей проблеме, я бы предложил:

  • обновить ваш вопрос соответствующими битами ваших persistence.xml и Spring
  • активировать ведение журнала (в частности, org.springframework.orm), чтобы увидеть, все ли хорошо во время инициализации
  • посмотреть, что вы получите, когда вы укажете unitName
...