L'obtention de l'EntityManager dans Spring + Hibernate
J'ai un Spring MVC 4.0 de l'application, et je suis en apprentissage de la JPA. J'utilise Hibernate comme l'implémentation JPA.
Je peux configurer Hibernate comme décrit dans cette tutoriel. Il fonctionne très bien, mais je dois utiliser Hibernate Session
objet:
@Autowired
SessionFactory sessionFactory;
...
Session session = sessionFactory.openSession();
Maintenant, je veux utiliser JPA est EntityManager
à la place. J'ai suivi cette tutoriel sur le même site web (la configuration est très similaire). Et j'ai essayé d'obtenir un EntityManager
objet de cette façon:
@PersistenceContext
EntityManager entityManager;
J'ai reçu un message runtime:
java.lang.IllegalStateException: No transactional EntityManager available
Puis, j'ai suivi la suggestion dans cette réponse, et essayé d'utiliser le code suivant:
@PersistenceContext
EntityManager entityManager;
...
entityManager=entityManager.getEntityManagerFactory().createEntityManager();
Il travaille quelques temps (environ 9 répétitif des invocations de méthode), puis l'application se bloque.
Quelle est la bonne façon d'obtenir EntityManager
dans Spring + Hibernate?
Je n'ai pas besoin tout de Printemps de l'opération de la fonctionnalité pour le moment. Je veux juste obtenir un accès à EntityManager
et de jouer avec JPA.
Spring/Hibernate fichier de configuration (hibernate.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test_db" />
<property name="username" value="test" />
<property name="password" value="test" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="net.myproject" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="persistenceExceptionTranslationPostProcessor" class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
<tx:annotation-driven />
</beans>
La classe où je tente de l'utiliser EntityManager
@Repository
public class ProductsService {
@PersistenceContext
EntityManager entityManager;
@Transactional
public GridResponse<Product> getProducts(GridRequest dRequest) {
//The following line causes the exception: "java.lang.IllegalStateException: No transactional EntityManager available"
Session session = entityManager.unwrap(Session.class);
//...
}
...
Pour le
@PersistenceContext EntityManager entityManager;
approche, ajouter tx:annotation-driven
et de marque de vos méthodes dans lesquelles vous pouvez utiliser l'entityManager comme @Transactional
.merci pour votre réponse. J'ai déjà essayé ces choses dans mes précédentes expériences, et je l'ai essayé une fois de plus tout à l'heure. J'ai eu le même message d'erreur:
java.lang.IllegalStateException: No transactional EntityManager available
. (J'ai la même exception sans <tx:annotation-driven />
et @Transactional
).Poster un peu plus le code source, comme lorsque vous utilisez cet EntityManager (la méthode et les définitions de classe avec toutes les annotations que vous pourriez avoir placé sur la classe). Est-ce une webapp? Si oui, postez le
web.xml
et indiquez dans quel .le fichier xml de la configuration que vous avez déjà posté peut être trouvé.Vous pouvez poster
spring-mvc-servlet.xml
ainsi?OriginalL'auteur Alex | 2014-08-12
Vous devez vous connecter pour publier un commentaire.
Pour la
@PersistenceContext EntityManager entityManager;
approche, ajoutertx:annotation-driven
pour votre .xml de configuration et de marque de vos méthodes dans lesquelles vous pouvez utiliserentityManager
comme@Transactional
.Session session = entityManager.unwrap(Session.class);
lève l'exception, mais je peux utiliser leentityManager
sans problème pour l'exécution des requêtes. Comme je l'ai déplacer à partir de l'API Hibernate pour JPA, je n'ai pas besoin de HibernateSession
s plus et je peux supprimer cette ligne complètement. Cependant, mon code ne fonctionne qu'avec<tx:annotation-driven />
en place. Donc cette réponse est correcte.OriginalL'auteur Andrei Stefan
Il peut être utiliser avec @Autocâblés comme indiqué dans https://stackoverflow.com/a/33742769/2028440
@Autowired
sur le constructeur de la classe, si possible, d'éviter d'avoir à utiliser individuellement sur chaque propriété.OriginalL'auteur Bằng Rikimaru