0

こんにちはすべて私はhybernate+JPAを使用してアプリケーション構成を行い、XAトランザクション管理とSpring 3.0のatomikosとmysqlは私のバックエンドです。ここではすべてが正常に機能していますが、例外がスローされたときにトランザクションを挿入すると、トランザクションはロールバックされますが、起きていません!!これが私たちのアプリケーションの小さなフローです。私たちのマネージャーレベルでは、私たちはビジネスと呼んでいます(ここではSpringIOCを使用しています)

Manager.java        
        insertuser()
         {
         //here we are getting transcation support from spring.

          business.insertuser();
         }

business.java 1つのメソッドinsertuser()を使用しています

insertuser()
  {
    Tauser taUser=new Tauser();
    taUser.setUsername("Maya");
    taUser.setPassword("*****")       
    Dao.insertDetails(taUser);
    throw new NullPointerException("checking transcation management"); 
    // because  of this exception throwing,it should rollback right,
    but its not happening.The property's are commiting in to the table.

 }

そして、1つのメソッドinsertuser(Object entity)を使用しているdao.javaクラス

 void insertDetails(Object entity)
       {
        this.getJpaTemplate().persist(entity);       
       }

と私たちのorm.xml

       <entity class="TaUser" name="TaUser">
<table name="ta_user" />
<attributes>
    <id name="userId">
        <column name="USER_ID" />
        <generated-value strategy="AUTO" />
    </id>
    <basic name="userName">
        <column name="USER_NAME" length="50" />
    </basic>   
    </attributes>

そして私のpersistence.xmlファイルは

<persistence-unit name="shop" transaction-type="JTA">
       <provider>org.hibernate.ejb.HibernatePersistence</provider>
         <jta-data-source>java:comp/env/jdbc/shobWeb</jta-data-source>
           <mapping-file>META-INF/orm.xml</mapping-file>
           <class>TaUser</class>
           ---------
           ---------
           ---------
           <properties>
            <property name="hibernate.transaction.manager_lookup_class" 
            value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"/>
            </properties>     
    </persistence-unit>
  </persistence>

そして、application / meta_inf/context.xmlでjndiを構成しました

  <Resource name="jdbc/shobWeb" auth="Container"  
                      driverClassName="com.mysql.jdbc.Driver"  
                      user="root"
                      password="root"  
                      type="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"   
                      factory="com.mysql.jdbc.jdbc2.optional.MysqlDataSourceFactory" 
                      url="jdbc:mysql://localhost:3306/shobWebSample"
                      explicitUrl="true" 
                      pinGlobalTxToPhysicalConnection="true" 
                      ></Resource> 

私の設定ファイルはconfig.xmlです

<beans:bean id="Manager"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <beans:property name="transactionManager">
        <beans:ref bean="transactionManager" />
    </beans:property>
    <beans:property name="target">
        <beans:ref local=" ManagerTarget" />
    </beans:property>
    <beans:property name="transactionAttributes">
        <beans:props>
            <beans:prop key="*">PROPAGATION_REQUIRED</beans:prop>
        </beans:props>
    </beans:property>
</beans:bean>

<beans:bean id="ManagerTarget"
    class="Manager">
    <beans:property name="Business" ref="Business" />
</beans:bean>
<beans:bean id="Business" class="PaymentsBusiness">
    <beans:property name="Dao" ref=" Dao" />             
</beans:bean>

<beans:bean id="Dao"
    class=" Dao">
    <beans:property name="jpaTemplate">
        <beans:ref bean="jpaTemplate" />
    </beans:property>
</beans:bean>

<beans:bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate">
    <beans:property name="entityManagerFactory">
        <beans:ref bean="entityManagerFactory" />
    </beans:property>
</beans:bean>


<beans:bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
 <beans:property name="persistenceUnitName" value="shop" />
    <beans:property name="jpaVendorAdapter">
        <beans:bean
            class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <beans:property name="generateDdl" value="false" />
            <beans:property name="showSql" value="true" /> 
         </beans:bean>
    </beans:property>
    <beans:property name="persistenceXmlLocation">
        <bean:value>classpath:META-INF/persistence.xml</beans:value>
    </beans:property>
</beans:bean>

問題はどこにありますか?実際、テーブル内のプロパティを更新しようとすると、トランザクションは正常に機能します(ロールバックとコミットが発生します)が、挿入操作を実行しようとすると、ロールバックは発生しません。

4

1 に答える 1

0

これは見れば見るほど混乱する。

まず、AOP 構成は実際のメソッドとどのように関連していますか? 構成方法では、「保存」または「削除」で始まるメソッドに関するトランザクションのみが作成され、その他すべてに関する読み取り専用トランザクションが作成されます。あなたのメソッドは と呼ばれinsertDetailsているので、うまくいきません。

次に、Spring がPlatformTransactionManager構成されていますか? 構成が見えません。

3 番目: クラスにデフォルトのパッケージを使用しているように見えますが、パッケージのクラスにポイントカットを定義していますcom.live.webAppl。それはあなたのクラスが本当にある場所ですか?

4 番目: 例外がスローされた時点で開いているトランザクションがあり、挿入メソッドがそのトランザクションに参加したか? そうでない場合は、ロールバックできません。ログ出力とともにデバッガーを使用して、どのトランザクションが作成されたか、および挿入メソッドが関与しているかどうかを確認します。Atomikos のログ レベルもデバッグ用に上げてみてください。

第 4 に、Java 1.4 コードベースで行き詰まっていますか? それ以外の場合は、注釈付きトランザクション宣言に進みます。(設定やコードで行われる多くの方法は、少し時代遅れに見えます。)

第 5 に、すべて小文字のパッケージ名を使用するという規則があります。クラスは大文字、メンバーとローカルは小文字で始まります。これにより、コードが読みやすくなります。(たとえば、Dao.insertUser()Java を読める人には静的メソッド呼び出しのように見えます。よくありません。)

于 2010-12-14T15:38:12.863 に答える