web-dev-qa-db-fra.com

Comment injecter JPA EntityManager à l'aide d'un ressort

Est-il possible d'avoir Spring injecter l'objet JPA entityManager dans ma classe DAO sans étendre JpaDaoSupport? Si oui, Spring gère-t-il la transaction dans ce cas?

J'essaie de garder ma configuration Spring aussi simple que possible:

<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>
40
marcosbeirigo

Oui, bien qu'il soit plein de pièges, car JPA est un peu particulier. Cela vaut vraiment la peine de lire la documentation sur l'injection de JPA EntityManager et EntityManagerFactory, sans dépendances Spring explicites dans votre code:

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

Cela vous permet soit d'injecter le EntityManagerFactory, soit d'injecter directement un proxy transactionnel thread-safe d'un EntityManager. Ce dernier rend le code plus simple, mais signifie plus de plomberie Spring est nécessaire.

32
skaffman

Est-il possible d'avoir du ressort pour injecter l'objet entityManager JPA dans ma classe DAO sans étendre JpaDaoSupport? si oui, Spring gère-t-il la transaction dans ce cas?

Ceci est documenté noir sur blanc dans 12.6.3. Implémentation des DAO basés sur JPA ordinaire :

Il est possible d'écrire du code sur le JPA ordinaire sans utiliser de dépendances Spring, en utilisant un EntityManagerFactory ou EntityManager injecté. Notez que Spring peut comprendre @PersistenceUnit et @PersistenceContext annotations au niveau du champ et de la méthode si un PersistenceAnnotationBeanPostProcessor est activé. Une implémentation DAO correspondante pourrait ressembler à ceci (...)

Et en ce qui concerne la gestion des transactions, jetez un œil à 12.7. Gestion des transactions :

Spring JPA permet à un JpaTransactionManager configuré d'exposer une transaction JPA au code d'accès JDBC qui accède au même DataSource JDBC, à condition que le JpaDialect enregistré prenne en charge la récupération de la connexion JDBC sous-jacente. Prêt à l'emploi, Spring fournit des dialectes pour les implémentations JPA Toplink, Hibernate et OpenJPA. Voir la section suivante pour plus de détails sur le mécanisme JpaDialect.

12
Pascal Thivent

Les dernières versions Spring + JPA résolvent fondamentalement ce problème. Vous pouvez en savoir plus sur l'utilisation de Spring et JPA ensemble dans n thread séparé

3
Denis Skarbichev