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);

        //...
    }

...
Ceci pourrait vous aider.
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