Подтвердить что ты не робот

Как вставить JPA EntityManager с помощью spring

У меня есть несколько вопросов о интеграции JPA + Spring, запущенной на Tomcat. Я искал какое-то время и не смог найти никакого конкретного ответа, поэтому вот оно:

Возможно ли, что Spring введет объект JPA entityManager в мой класс DAO без расширения JpaDaoSupport? Если да, то Spring управляет транзакцией в этом случае?

Я пытаюсь сохранить конфигурацию Spring максимально простой:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="em"/>
</bean>
<bean id="em" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="myPU"/>
</bean>

EDIT: это было очень полезно, спасибо вам всем!

4b9b3361

Ответ 1

Да, хотя он полный gotchas, поскольку JPA немного странно. Очень стоит прочитать документацию по вводу JPA EntityManager и EntityManagerFactory без явных зависимостей Spring в вашем коде:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/orm.html#orm-jpa

Это позволяет либо вставлять EntityManagerFactory, либо напрямую вводить поточно-безопасный, транзакционный прокси EntityManager. Последний обеспечивает более простой код, но означает, что требуется больше Spring сантехники.

Ответ 2

Возможно ли, чтобы spring ввел объект entityManager JPA в мой класс DAO без расширения JpaDaoSupport? если да, spring управляет транзакцией в этом случае?

Это документировано черным по белому в 12.6.3. Внедрение DAO на основе простой JPA:

Можно написать код против простой JPA без использования Springзависимости, используя EntityManagerFactory или EntityManager. Обратите внимание, что spring может понять @PersistenceUnit и @PersistenceContext аннотации как на уровне поля и метода, если PersistenceAnnotationBeanPostProcessorвключен. Соответствующий DAO реализация может выглядеть так (...)

А что касается управления транзакциями, посмотрите 12.7. Управление транзакциями:

Spring JPA позволяет сконфигурированному JpaTransactionManager выставлять транзакцию JPA для кода доступа JDBC, который обращается к тому же источнику данных JDBC, при условии, что зарегистрированный JpaDialect поддерживает извлечение базового JDBC-соединения. Из коробки spring предоставляет диалекты для реализаций Toplink, Hibernate и OpenJPA JPA. Подробнее о механизме JpaDialect см. Следующий раздел.

Ответ 3

Последние версии Spring + JPA решают эту проблему принципиально. Вы можете узнать больше о том, как использовать Spring и JPA togather в отдельном потоке