0

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

但是如果我不在持久层方法上使用@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 id="collegeHibernate" class="com.velos.p1b.persistence.college.impl.CollegeHibernateImpl">
   <property name="sessionFactory" ref="sessionFactory" />
</bean>

会话工厂是弹簧注释工厂,事务是这样管理的。

<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 服务器。我在想的是我的交易没有得到管理。任何例子都值得赞赏。

4

1 回答 1

0

HibernateTemplate allow non-transactional data access (for auto-commit mode), it will create a new Session (if allowCreate is true) and close them after execution of the HibernateCallback. Most DBMs will rollback if you don't commit but Oracle will commit them (for you).

To get a Exception you need to set allowCreate to false in HibernateTemplate.

More info: https://community.jboss.org/wiki/Non-transactionalDataAccessAndTheAuto-commitMode

于 2012-02-20T17:52:29.483 回答