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>
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.
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
ouEntityManager
injecté. Notez que Spring peut comprendre@PersistenceUnit
et@PersistenceContext
annotations au niveau du champ et de la méthode si unPersistenceAnnotationBeanPostProcessor
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 leJpaDialect
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écanismeJpaDialect
.
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é