Struts + Spring + Spring托管事务+ hibernate

时间:2012-02-18 19:00:20

标签: hibernate spring struts2 transactional spring-transactions

我使用Struts作为前端和Spring用于IOC,使用hibernate + c3p0作为数据源池。 我正在为持久层使用annotationsessionfactory bean和@Transaction批注。 所有这些都是使用spring beans来管理的。

但如果我没有在持久层方法上使用@transactional注释,我的数据也会被保存。

示例:

public interface CollegeHibernate {
   CollegeWTO saveCollege(CollegeWTO collegeWTO);
}


public class CollegeHibernateImpl extends HibernateTemplate implements CollegeHibernate{
   public CollegeWTO saveCollege(CollegeWTO collegeWTO) {
      College college = CollegeHelper.CollegeWTO_to_Model(new College(), collegeWTO);
   }
}

bean是

<bean id="collegeHibernate" class="com.velos.p1b.persistence.college.impl.CollegeHibernateImpl">
   <property name="sessionFactory" ref="sessionFactory" />
</bean>
会议工厂是spring注释工厂和  交易是这样管理的。

<tx:annotation-driven transaction-manager="transactionManager" />
   <tx:advice id="txAdvice" transaction-manager="transactionManager">
      <tx:attributes>
         <tx:method name="save*"  read-only="true" rollback-for="java.lang.Throwable" />
      </tx:attributes>
   </tx:advice>

此方法保存数据,但我根本不会使其成为事务性的。据我说,它必须通过例外。我使用的是oracle 11g和j-boss 4.2服务器。我在想的是我的交易没有得到管理。任何例子都表示赞赏。

1 个答案:

答案 0 :(得分:0)

HibernateTemplate允许非事务性数据访问(对于自动提交模式),它将创建一个新的Session(如果allowCreate为true)并在执行HibernateCallback后关闭它们。如果你不提交,大多数DBM都会回滚,但是Oracle会为你提交它们(。)。

要获得异常,您需要在HibernateTemplate中将allowCreate设置为false。

更多信息:https://community.jboss.org/wiki/Non-transactionalDataAccessAndTheAuto-commitMode