Как внедрить JPA EntityManager с помощью Spring

Возможно ли, чтобы 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>

person marcosbeirigo    schedule 10.03.2010    source источник


Ответы (3)


Да, хотя здесь полно подводных камней, поскольку 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.

person skaffman    schedule 10.03.2010

Возможно ли, чтобы Spring вводил объект JPA entityManager в мой класс 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 см. в следующем разделе.

person Pascal Thivent    schedule 10.03.2010

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

person Denis Skarbichev    schedule 22.01.2013