Hibernate - 想把删除和存储放在一个“事务”中,如果pb发生,所有都将被回滚

时间:2011-09-26 12:53:00

标签: hibernate persistence flush

我有一个删除某些项目的方法,然后插入其他一些项目。

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 个答案:

答案 0 :(得分:2)

    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 :(得分:1)

将这两个方法调用放在一个唯一的事务中。

法拉盛与交易没有任何关系。它只是意味着“真正执行持久化会话中所做的修改所需的所有SQL语句”。但提交只会在交易结束时完成。

手动刷新会话几乎总是不必要的。让Hibernate必须这样做。

另外,请注意,DAO应该是允许查询和更新实体的服务对象。它不应该是一个持久的实体。

阅读http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#transactionshttp://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#objectstate-flushing

答案 2 :(得分:1)

Spring为transaction management提供了很好的解决方案。 在此页面上,您将找到使用XML文件配置spring / hibernate的方法。

如果您需要一些解释,请询问,我会尽快帮助您。

一些例子:

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