【问题标题】:spring-data-neo4j ChainedTransactionManager causes javax.persistence.TransactionRequiredExceptionspring-data-neo4j ChainedTransactionManager 导致 javax.persistence.TransactionRequiredException
【发布时间】:2015-04-29 05:42:49
【问题描述】:

我有一个项目使用 spring-data-neo4j 和带有 Hibernate 的 spring 数据。 Neo4j 和 Hibernate 会持久化不同的实体,因此不需要 spring-data-neo4j-cross-store。

我正在尝试使用 org.springframework.data.transaction.ChainedTransactionManager 类作为我的事务管理器,但是每当我尝试为 Hibernate 使用事务时,我都会得到一个 javax。 persistence.TransactionRequiredException.

相关applicationContext.xml:

<context:annotation-config />
<context:spring-configured/>
<context:component-scan base-package="my.package" />

<bean id="entityManagerFactoryJpa"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="my-persistence-unit-jpa" />
</bean>

<bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactoryJpa"/>
</bean>
<bean id="jtaTransactionManager" class="org.springframework.data.neo4j.config.JtaTransactionManagerFactoryBean">
    <constructor-arg ref="graphDatabaseService"/>
</bean>
<bean id="transactionManager" class="org.springframework.data.transaction.ChainedTransactionManager">
    <constructor-arg>
        <list>
            <ref bean="jpaTransactionManager"/>
            <ref bean="jtaTransactionManager"/>
        </list>
    </constructor-arg>
</bean>

<neo4j:repositories base-package="my.package" />
<neo4j:config base-package="my.package" graphDatabaseService="graphDatabaseService" />

<bean id="graphDatabaseService"
    class="org.springframework.data.neo4j.support.GraphDatabaseServiceFactoryBean"
    destroy-method="shutdown" scope="singleton">
    <constructor-arg value="target/graph.db" />
    <constructor-arg>
        <map>
            <entry key="enable_remote_shell" value="false" />
        </map>
    </constructor-arg>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

每当任何 Hibernate 事务尝试执行时,我都会收到此错误:

javax.persistence.TransactionRequiredException: 没有事务在 进展

如何在没有这些事务错误的情况下将 spring-data-neo4j 与其他 Spring 项目一起使用?

【问题讨论】:

    标签: hibernate spring-data spring-data-neo4j


    【解决方案1】:

    为了让我的项目正常运行,我必须更改 ChainedTransactionManager bean 的名称。

    相关applicationContext.xml:

    <context:annotation-config />
    <context:spring-configured/>
    <context:component-scan base-package="my.package" />
    
    <bean id="entityManagerFactoryJpa"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="persistenceUnitName" value="my-persistence-unit-jpa" />
    </bean>
    
    <bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactoryJpa"/>
    </bean>
    <bean id="jtaTransactionManager" class="org.springframework.data.neo4j.config.JtaTransactionManagerFactoryBean">
        <constructor-arg ref="graphDatabaseService"/>
    </bean>
    <bean id="chainedTransactionManager" class="org.springframework.data.transaction.ChainedTransactionManager">
        <constructor-arg>
            <list>
                <ref bean="jpaTransactionManager"/>
                <ref bean="jtaTransactionManager"/>
            </list>
        </constructor-arg>
    </bean>
    
    <neo4j:repositories base-package="my.package" />
    <neo4j:config base-package="my.package" graphDatabaseService="graphDatabaseService" />
    
    <bean id="graphDatabaseService"
        class="org.springframework.data.neo4j.support.GraphDatabaseServiceFactoryBean"
        destroy-method="shutdown" scope="singleton">
        <constructor-arg value="target/graph.db" />
        <constructor-arg>
            <map>
                <entry key="enable_remote_shell" value="false" />
            </map>
        </constructor-arg>
    </bean>
    
    <tx:annotation-driven transaction-manager="chainedTransactionManager" />
    

    完成此更改后,我的项目开始按预期运行。显然,Spring 会在后台自动创建名为“transactionManager”的事务管理器,因此如果您将 ChainedTransactionManager 命名为“transactionManager”,您会遇到某种冲突,并且 Spring 不知道要为事务使用哪个事务管理器。

    【讨论】:

      猜你喜欢
      • 2014-05-31
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 2015-08-11
      • 1970-01-01
      相关资源
      最近更新 更多