繁体   English   中英

hibernate事务没有正确回滚

[英]hibernate transaction not rolling back correctly

我有2个表,比如Item和Property以及映射到两者的hibernate对象。 表Item到Property的映射看起来像

<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个属性。

编辑---

我班上的样子是什么

@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),抛出的最低异常是

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)

交易不是“级联”。 在JDBC级别,事务包括:

  1. 关闭自动提交
  2. 执行一些陈述
  3. 调用java.sql.Connection.commit()java.sql.Connection.rollback()

如果你说有些东西正在提交而有些东西被回滚,那么你的交易管理就会出现问题。 自动提交已启用或您实际上有多次调用commit()正在发生。

如果执行以下操作,则由Spring管理事务:在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 "

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM