【问题标题】:Spring Integration: javax.persistence.TransactionRequiredException: no transaction is in progressSpring 集成:javax.persistence.TransactionRequiredException:没有正在进行的事务
【发布时间】:2014-02-20 09:50:30
【问题描述】:

我想在 Spring Integration 中实现以下目标:

  1. 在输入通道中收到一条消息
  2. 这会通过一个 Transformer,该 Transformer 将其保存在 DB 中,从而为其提供一个 ID
  3. 它继续进一步处理到一些外部系统中。

我的变压器是这样的:

@PersistenceContext
private EntityManager em;

@Transactional
public ServiceResponse persistBatchOperation(List<OperationDTO> operations) {

    for (OperationDTO op : operations) {
        em.persist(op);
    }
    em.flush();

...其余省略

在 em.flush() 上抛出此异常:

    org.springframework.integration.transformer.MessageTransformationException: org.springframework.integration.MessageHandlingException: javax.persistence.TransactionRequiredException: no transaction is in progress

我的集成上下文包含以下元素:

<tx:annotation-driven />

<bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

AspectJ 部分:

<tx:advice id="txGatewayJPA" transaction-manager="jpaTransactionManager">
        <tx:attributes>
            <tx:method name="*HLR*" />
        </tx:attributes>
    </tx:advice>

<aop:pointcut id="allServices"
            expression="execution(* com.mypackage.IntegrationService.*(..))" />
        <aop:advisor advice-ref="txGatewayJPA" pointcut-ref="allServices" />
    </aop:config>

休眠和数据库配置:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" />
        <property name="persistenceUnitName" value="hiperPU" />
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
        <property name="jpaDialect" ref="jpaDialect" />
    </bean>

    <bean id="jpaVendorAdapter"
        class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <property name="database" value="POSTGRESQL" />
        <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
    </bean>

    <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />

<bean id="dataSource" class="***.ConfigRoutingDatasource">
        <property name="configName" value="$hiperConfig{DATASOURCE_NAME_DATA}" />
        <property name="defaultTargetDataSource">
            <bean class="org.apache.commons.dbcp.BasicDataSource"
                destroy-method="close">
                <property name="driverClassName" value="org.postgresql.Driver" />
                <property name="url"
                    value="jdbc:postgresql://XXX" />
                <property name="username" value="XXX" />
                <property name="password" value="XXX" />
                <property name="maxActive" value="50" />
                <property name="maxIdle" value="50" />
                <property name="maxWait" value="600000" />
                <property name="testOnBorrow" value="true" />
                <property name="validationQuery" value="select version()" />
                <property name="defaultTransactionIsolation"
                    value="#{ T(java.sql.Connection).TRANSACTION_READ_COMMITTED }" />
            </bean>
        </property>
    </bean>

在我看来,我已经配置了使我的转换器方法具有事务性的所有内容。为什么它不起作用?

【问题讨论】:

    标签: java spring hibernate jpa


    【解决方案1】:

    试试 em.merge(op);

    添加@Transactional(readOnly = false)

    并尝试使用

    EntityManager em = emf.createEntityManager();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-29
      • 2010-12-20
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多