2

次のスキーマでは

Controller -> Service -> DAO Service オペレーションを @Transactional にしようとしています

私の UserService.fooFunction() で私は呼び出します

Entity e = dao.find(key)
e.setProperty(something)
dao.update(e)

最後に dao.update(e) があります

em.flush() //EntityManager obtained by @PersistenceContext annotation (injected by spring IoC)

flush() を呼び出すと、persistenceException がスローされます。

javax.persistence.TransactionRequiredException No externally managed transaction is currently active for this thread
    at org.eclipse.persistence.internal.jpa.transaction.JTATransactionWrapper.throwCheckTransactionFailedException(JTATransactionWrapper.java:86)

私が間違ったことをしたアイデアが不足しています。助けていただければ幸いです:)

以下の構成のチャンクを見つけることができます。

 <bean id="entityManagerFactory"  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceUnitName" value="myPU" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter" id="eclipselinkVendorAdapter">
        ..
        </bean>
    </property>

</bean>

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">

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

aop 部分:

    <aop:config>

    <aop:pointcut id="userServiceOperation"
      expression="execution(* org.mypackage.UserServiceImpl.*(..))"/>

    <aop:advisor pointcut-ref="userServiceOperation" advice-ref="txUserServiceAdvice"/>

</aop:config>

<tx:advice id="txUserServiceAdvice">
    <tx:attributes>
        <tx:method name="get*" read-only="true" propagation="REQUIRES_NEW"/>
        <tx:method name="update*" read-only="false" propagation="REQUIRES_NEW"/>
        <tx:method name="*" propagation="REQUIRES_NEW"/>
    </tx:attributes>
</tx:advice>

トランザクションの注釈はありません。私の春のアプリを展開すると、見ることができます

[<date>] DEBUG support.DefaultListableBeanFactory: Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
[<date>] DEBUG interceptor.NameMatchTransactionAttributeSource: Adding transactional method [get*] with attribute [PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT,readOnly]
[<date>] DEBUG interceptor.NameMatchTransactionAttributeSource: Adding transactional method [update*] with attribute [PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT]
[<date>] DEBUG interceptor.NameMatchTransactionAttributeSource: Adding transactional method [*] with attribute [PROPAGATION_MANDATORY,ISOLATION_DEFAULT]
4

2 に答える 2

4

重要な問題はここにありました

tx:annotation-driven は、Bean が定義されているのと同じアプリケーション コンテキスト内の @Transactional のみを検索します。サービス。詳細は、セクション15.2「DispatcherServlet」を参照してください。

サービスのコンポーネントスキャンと同じアプリケーションコンテキストを配置すると、問題が解決しました:)

于 2011-03-07T13:57:13.167 に答える
1

JtaTransactionManagerトランザクション マネージャーとして宣言しました。あなたのプログラムは、本格的なアプリケーション サーバー (JBoss、WebSphere、WebLogic など) などの JTA 対応環境で実行されていますか?

JTA 環境がない場合は、JPATransactionManager代わりに以下を使用する必要があります。

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
于 2011-03-07T14:52:55.453 に答える