транзакция гибернации не откатывается правильно - PullRequest
3 голосов
/ 03 августа 2011

У меня есть 2 таблицы, скажем Item и Property, и спящий объект, сопоставленный обеим.Отображение таблицы Item в Property выглядит как

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

Элемент может иметь несколько свойств.Все как выбрать, вставка работает правильно.но когда возникает ошибка, вставки в таблицу свойств не выполняются откатом.

Что происходит, если я редактирую элемент с N свойствами и ввожу недопустимое значение в поле, когда я в следующий раз получуу элемента 2 * свойства N *. 1006 *

Редактировать ---

Мой класс выглядит так:

@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)

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Транзакции не "каскадные". На уровне JDBC транзакция состоит из:

  1. Отключение автоматической фиксации
  2. Выполнение некоторых операторов
  3. Вызов java.sql.Connection.commit () или java.sql.Connection.rollback () .

Если вы говорите, что некоторые вещи совершаются, а некоторые откатываются, значит, что-то не так в вашем управлении транзакциями. Либо автокоммит включен, либо у вас есть несколько вызовов commit ().

0 голосов
/ 03 августа 2011

Транзакции обрабатываются 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 <a href="http://www.springframework.org/schema/tx/spring-tx-3.0.xsd" rel="nofollow">http://www.springframework.org/schema/tx/spring-tx-3.0.xsd</a>"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...