Hibernate - хотите поместить delete и сохранить в одну «транзакцию», если pb произойдет, все будет откатано - PullRequest
0 голосов
/ 26 сентября 2011

У меня есть метод, который удаляет некоторые элементы, а затем вставляет некоторые другие элементы.

public void refresh() {
    if (newitems != null) {
        toto.clear();
        for (totoDao p : newItems) {
            toto.store(p);
        }
    }
    newitems = null;
}

public void clear() {
    final Session session = this.getHibernateUtil().getSession();
    int n = session.createQuery(DELETE).executeUpdate();
    session.clear();
    session.flush();
}

public void store(TotoDao object) {         
    final Session session = this.getHibernateUtil().getSession();
    session.saveOrUpdate(object);
    session.flush();
}

На данный момент у меня есть один метод сброса в clear () и другой в методе store ().

Я хочу добавить все эти тезисы в одну «транзакцию», если что-то появляется, приложение перезапускается сразу после toto.clear (), например, я хочу, чтобы транзакция откатила весь блок.

Так что же является лучшим решением для выступлений и упорств?

Thx!

Ответы [ 3 ]

2 голосов
/ 26 сентября 2011
    session = sessionFactory.openSession();  
    Transaction tx = null;

try{
     tx = session.beginTransaction();  

    ... your add/store/delete/.... 
    tx.commit();  
}catch(Throwable(or other type of Exception you like) ex){
    tx.rollback();
}
1 голос
/ 26 сентября 2011

Spring предлагает хорошие решения для управления транзакциями .На этой странице вы найдете способ настроить spring / hibernate с файлами XML.

Если вам нужно какое-то объяснение, просто спросите, и я постараюсь помочь вам как можно скорее.

Некоторые примеры:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

  <aop:config>
    <aop:pointcut id="pointcutId" expression="execution(* com.stackoverflow.service.FooService.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcutId"/>
  </aop:config>

  <tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
      <!-- all methods starting with 'get' are read-only -->
      <tx:method name="get*" read-only="true"/>
      <!-- other methods (By example Rollback for NullPointerException)-->
      <tx:method name="*" read-only="false" rollback-for="NullPointerException"/>
    </tx:attributes>
  </tx:advice>

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
   <property name="sessionFactory" ref="sessionFactory" /> 
</bean>

 ...

</beans>
1 голос
/ 26 сентября 2011

Просто заключите эти два вызова метода в уникальную транзакцию.

Flushing не имеет ничего общего с транзакциями.Это просто означает «действительно выполнить все операторы SQL, необходимые для сохранения изменений, внесенных в сеанс».Но фиксация будет сделана только в конце транзакции.

Сброс сеанса вручную почти всегда не требуется.Пусть Hibernate сделает это, когда это будет необходимо.

Также обратите внимание, что DAO должен быть сервисным объектом, позволяющим запрашивать и обновлять объекты.Это не должен быть постоянный объект.

Чтение http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#transactions и http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#objectstate-flushing

...