2011-08-03 90 views
3

我有2个表,比如Item和Property以及映射到两者的hibernate对象。表格Item to Property的映射看起来像休眠事务没有正确回滚

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

一个项目可以有多个属性。一切都像选择,插入正常工作。但是当出现错误时,对属性表的插入不会回滚。

会发生什么情况是,如果我正在编辑具有N个属性的项目并在字段中输入无效值,那么下一次检索该项目时,它将具有2 * N个属性。

编辑---

什么我的课貌似是

@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); 
    ... 
} 

我使用注释交易(@Transactional)与Spring框架和最低的例外越来越抛出是

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. 关闭自动提交
  2. 执行某些语句
  3. 调用java.sql.Connection.commit()java.sql.Connection.rollback()

如果您在说有些事情正在提交并且有些事情已经回滚,那么您的事务管理存在问题。自动提交或者你实际上有多个调用commit()发生。

+0

更新了这个问题,使其更加清晰,除了一些例外,我得到了更多的调试。我不再打电话回滚或提交,因为我假设@Transactional注释已经为我做了。 – randomThought

+0

正确配置,@Transactional建立声明式事务边界,Spring将根据需要为您开始,提交和回滚异常。如果您正在进行打开会话或开始,提交或回滚事务等任何事情,那将会产生干扰。您发布的代码没有任何明显错误,但它只是一个小小的片段,并且不包含任何事务配置。异常表明发生了异常,因为Spring将永远不会尝试提交/回滚未启动的事务。 –

+0

我需要什么事务配置? spring正在使用后端的c3p0连接池来处理数据库连接。没有任何声明会自行打开或启动任何事务或会话。在处理hibernate或session的函数中只有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

我已经在配置中有类似的东西。 和bean配置相同,只不过id ='txManager'。 – randomThought