Spring 3.0.0 Hibernate 3 MySQL 5 JBoss 5
我有一个使用Spring的hibernate事务的应用程序。我有一个影响两个表的更新,如果第二个更新有异常,第一个更新不会回滚。
有趣的是,我创建了一个不使用Spring的小型测试Java应用程序,但使用了明确的Hibernate事务管理,并使用完全相同的Hibernate配置和相同的JBoss数据源配置,并且工作正常。 Hibernate显然将自动提交设置为false,然后在事务完成后将其设置回true。回滚正确回滚第一次更新。
这是我的Spring配置:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:TappDataMySqlDS" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
singleton="true">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>A.hbm.xml</value>
<value>B.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.use_sql_comments">false</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.c3p0.min_size">5</prop>
<prop key="hibernate.c3p0.max_size">20</prop>
<prop key="hibernate.c3p0.timeout">300</prop>
<prop key="hibernate.c3p0.max_statements">50</prop>
<prop key="hibernate.c3p0.idle_test_period">3000</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="transactionAttributeSource"
class="org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource" />
<bean id="com.tapp.tss.core.dao.SyncDAO" class="com.tapp.tss.core.dao.SyncDAO">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="dao.proxy.SyncDAO"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target" ref="com.tapp.tss.core.dao.SyncDAO" />
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
Dao代码:
public void save() {
Session session = org.springframework.orm.hibernate3.support.HibernateDaoSupport.getSession();
try {
A a = new A();
B b = new B();
a.setPropName("abc");
a.setPropValue("xyz");
b.setFieldName("abc");
b.setFieldValue("xyz");
a.getASet().add(b);
session.save(a);
session.flush();
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
}catch (Exception e) {
e.printStackTrace();
}finally {
if (autoConnRelease) {
releaseSession(session);
}
}
是的,我搜索了很多这个问题,但没有真正找到解决方案。我不知道出了什么问题。
有什么建议吗?