我有一个删除某些项目的方法,然后插入其他一些项目。
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!
答案 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/#transactions和http://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>