Допустимая конфигурация Spring JPA Hibernate не работает с JdbcTemplate?

У меня есть рабочая конфигурация Spring для JPA с провайдером Hibernate:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true"/>
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
        </props>
    </property>
</bean>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

<tx:annotation-driven mode="aspectj"/>
<bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"/>

Эта конфигурация работает в небольшом веб-приложении на основе Spring.

Но когда я вставляю ту же конфигурацию в другое существующее веб-приложение на основе Spring, я получаю следующее исключение:

javax.persistence.TransactionRequiredException: транзакция не выполняется

Я думаю, что у него есть некоторый конфликт с шаблонами Spring JDBC:

<bean id="mysqlTemplate"
    class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource" />
</bean>

Как я могу заставить это работать бок о бок?


person Stefaan Neyts    schedule 28.01.2013    source источник
comment
посмотрите, есть ли ответы здесь stackoverflow.com/questions/1801828/ помогает?   -  person justMe    schedule 28.01.2013
comment
Мы обнаружили, что JdbcTemplate не влияет на JPA Hibernate. Вероятно, это связано с неправильной настройкой Spring ContextLoaderListener и DispatcherServlet. Но что?   -  person Stefaan Neyts    schedule 29.01.2013
comment
попробуйте поместить ссылку на свойство для entityManagerFactory внутри jpaTransactionManager, например: ‹property name=entityManagerFactory ref=entityManagerFactory/> посмотрите, пропущены ли конфигурации   -  person justMe    schedule 29.01.2013


Ответы (1)


«Транзакция не выполняется» просто означает, что вы пытаетесь где-то использовать EntityManager, и вы не начали транзакцию в первую очередь. Трассировка стека точно скажет вам, где это находится. Поскольку вы используете транзакции, управляемые аннотациями, просто убедитесь, что у вас есть соответствующий @Transactional где-то вверх по цепочке вызовов от места, где происходит исключение.

person Ryan Stewart    schedule 28.01.2013
comment
Работает с @Transactional в проекте без JdbcTemplate. Не работает с @Transactional в проекте с JdbcTemplate. Я пытался установить @Transactional(propagation=Propagation.XXX) на все возможные значения. Каждый раз я получаю одно и то же исключение. - person Stefaan Neyts; 28.01.2013
comment
Я сказал уместно @Transactional. Скорее всего, вы работаете с транзакцией, которая была открыта для неправильного источника данных, диспетчера сущностей или чего-то еще. - person Ryan Stewart; 28.01.2013
comment
Я создал отдельный источник данных JNDI в контексте Tomcat. Для каждого источника данных был отдельный менеджер транзакций. @Transactional был настроен с правильным диспетчером транзакций, а @PersistenceContext был введен правильно. Я мог читать базу данных только для чтения, я мог автоматически генерировать таблицы, я не мог что-то зафиксировать в базе данных: entityManager.flush(); все время выдавал исключение. - person Stefaan Neyts; 29.01.2013