2012-02-18 23 views
0

私は、StrutsをIOCのフロントエンドとSpringとして、そしてhibernate + c3p0をデータソースプーリングとして使用しています。 私は、永続的な層のためにannotationsessionfactory beanと@Transactionアノテーションを使用しています。 これはすべて豆を使用して管理されています。Struts + Spring + Spring管理トランザクション+ hibernate

でも、永続化レイヤメソッドで@transactionalアノテーションを使用していない場合でも、データが保存されます。

例:

public interface CollegeHibernate { 
    CollegeWTO saveCollege(CollegeWTO collegeWTO); 
} 


public class CollegeHibernateImpl extends HibernateTemplate implements CollegeHibernate{ 
    public CollegeWTO saveCollege(CollegeWTO collegeWTO) { 
     College college = CollegeHelper.CollegeWTO_to_Model(new College(), collegeWTO); 
    } 
} 

Beanが

<bean id="collegeHibernate" class="com.velos.p1b.persistence.college.impl.CollegeHibernateImpl"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

セッションファクトリは、春の注釈の工場で、 トランザクションは次のように管理されています。

<tx:annotation-driven transaction-manager="transactionManager" /> 
    <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
     <tx:attributes> 
     <tx:method name="save*" read-only="true" rollback-for="java.lang.Throwable" /> 
     </tx:attributes> 
    </tx:advice> 

このメソッドはデータを保存しますが、トランザクション化はしません。私によれば、それは例外を通らなければならない。私はOracle 11gとj-boss 4.2サーバーを使用しています。私が考えているのは、私の取引が管理されていないということです。いずれの例も高く評価されます。

答えて

0

HibernateTemplateは非トランザクションデータアクセス(自動コミットモード用)を可能にするため、HibernateCallbackの実行後に新しいセッション(allowCreateがtrueの場合)を作成して閉じます。コミットしないと、ほとんどのDBMがロールバックしますが、Oracleはそれらをコミットします(あなたのために)。

例外を取得するには、HibernateTemplateでallowCreateをfalseに設定する必要があります。

詳細情報:https://community.jboss.org/wiki/Non-transactionalDataAccessAndTheAuto-commitMode

関連する問題