我使用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服务器。我在想的是我的交易没有得到管理。任何例子都表示赞赏。
答案 0 :(得分:0)
HibernateTemplate允许非事务性数据访问(对于自动提交模式),它将创建一个新的Session(如果allowCreate为true)并在执行HibernateCallback后关闭它们。如果你不提交,大多数DBM都会回滚,但是Oracle会为你提交它们(。)。
要获得异常,您需要在HibernateTemplate中将allowCreate设置为false。
更多信息:https://community.jboss.org/wiki/Non-transactionalDataAccessAndTheAuto-commitMode