2011-08-03 11 views
3

2つのテーブルがあり、アイテムとプロパティ、および両方にマップされた休止状態のオブジェクトがあります。プロパティへのテーブルアイテムのマッピングは、次のようになります。hibernate transactionが正しくロールバックされない

<set name="propertySet" cascade="all-delete-orphan"> 
    <key column="item_id" not-null="true"/> 
    <one-to-many class="Property"/> 
</set> 

アイテムは複数のプロパティを持つことができます。 select、insertのようなものはすべて適切に動作します。エラーが発生した場合、プロパティテーブルへの挿入はロールバックされません。

N個のプロパティを持つアイテムを編集してフィールドに無効な値を入力すると、次にアイテムを取得するときに2 * Nのプロパティがあります。

編集---

何を私のクラスがどのように見えるが、私は、Springフレームワークでアノテート取引(@Transactional)を使用していますし、最低の例外が投げ

@Autowired 
SessionFactory sessionFactory 

@Transactional 
public void updateItem(Item i){ 
    ... 
    // The only 2 statements dealing with hibernate or session in this function 
    ItemModel im = sessionFactory.getCurrentSession().get(...); 

    sessionFactory.getCurrentSession().update(updatedItem); 
    ... 
} 

Caused by: org.springframework.transaction.TransactionSystemException: Could not roll back Hibernate transaction; nested exception is org.hibernate.Tra 
nsactionException: Transaction not successfully started 
     at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:679) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:845) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:822) 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:412) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:111) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
     at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625) 
Caused by: org.hibernate.TransactionException: Transaction not successfully started 
     at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:183) 
     at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:676) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:845) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:822) 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:412) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:111) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
     at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625) 
    ... 
    ... 
     at org.apache.catalina.valves.SSLValve.invoke(SSLValve.java:113) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) 
     at org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:894) 
     at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:719) 
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:2101) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:662) 
です

答えて

2

トランザクションは「カスケード」しません。 JDBCレベルでは、トランザクションの構成は次のとおりです。

  1. java.sql.Connection.commit()またはjava.sql.Connection.rollback()を呼び出すいくつかのステートメント
  2. を実行すると自動コミット
  3. をオフにします。

いくつかのことがコミットされていて、あるものがロールバックされていると言えば、トランザクション管理には何か問題があります。自動コミットがオンになっているか、実際にcommit()が複数回呼び出されています。

+0

であり、より明確にするために質問が更新されましたが、いくつかの例外を除いて、私はさらにデバッグしました。 @Transactionalアノテーションがすでに私のために行っていると仮定しているので、私はもはやロールバックまたはコミットする必要はありません。 – randomThought

+0

@Transactionalは適切に設定されているため、Springが適切な場合に例外を開始、コミット、ロールバックする場合には、宣言的なトランザクション境界を確立します。セッションを開始する、トランザクションを開始する、コミットする、ロールバックするなどの操作を行うと、その操作が妨げられます。投稿したコードに間違ったものは何もありませんが、これはほんの小さなスニペットであり、トランザクション設定も含まれていません。この例外は、Springが起動されていないトランザクションをコミット/ロールバックしようとしないため、何か異常が発生していることを示します。 –

+0

どのトランザクション構成が必要ですか?バネはデータベース接続を処理するためにバックエンドのc3p0接続プールを使用しています。トランザクションまたはセッションを単独で開くか、または開始する声明はありません。休止状態またはセッションを処理する関数には2つの文しかありません。私は自分自身のセッションとトランザクションの問題を考えてみましたが、問題はあるかもしれませんが、どちらも問題ありませんでした。 – randomThought

0

取引次なければ春でボンネットの下に管理されている:あなたのXMLの設定で、あなたは1が必要です)トランザクションを有効にして、次のように2)、トランザクションマネージャを設定します。

<tx:annotation-driven /> 
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="mainSessionFactory" /> 
</bean> 

のTx schemaLocationはhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "

+0

私はすでに設定で何かsimliarを持っています。 そして、id = 'txManager'以外のbeanの設定は同じです。 – randomThought

関連する問題