首先说明下小弟的情况,现在不清楚事务是不是回滚了,我列举几个例子,希望有高手帮忙。
首先是正常情况下插入是可以正常进行的。控制台打印出hibernate生成的sql语句
Hibernate: insert into user (username, password) values (?, ?)
Hibernate: insert into user_constraint (x, id) values (?, ?)
package edu.whpu.dao.impl;import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;import edu.whpu.dao.SuperDao;
import edu.whpu.dao.UserDao;
import edu.whpu.model.User;@Repository
@Transactional
public class UserDaoImpl extends SuperDao implements UserDao { @Override
public void save(User user) {
this.getHibernateTemplate().save(user);
}
}上面是UserDaoImpl.java的代码
当我在save方法里throw new RuntimeException();抛出一个runtime异常的时候,在进行插入
控制台只显示一条hibernate生成的sql语句。
Hibernate: insert into user (username, password) values (?, ?)user表和user_constraint表是一对一的关系,这样造成了只有user表里插入了数据,user_constraint里没有数据插入另外我在save方法里抛出runtime异常以前,执行另外一个数据库的操作,例如
User u = this.getHibernateTemplate().load(User.class, 1);
u.setUsername("wangwu");
this.getHibernateTemplate().update(u);
增加了这样的一个数据库操作,在继续执行save方法。控制台输出hibernate生成的sql,并没有update的sql语句
Hibernate: select user0_.id as id0_1_, user0_.username as username0_1_, user0_.password as password0_1_, constraint1_.id as id1_0_, constraint1_.x as x1_0_ from user user0_ left outer join user_constraint constraint1_ on user0_.id=constraint1_.id where user0_.id=?
Hibernate: insert into user (username, password) values (?, ?)
这样造成的结果是更新的操作没有成功执行,不知道是事务回滚了,还是根本就没执行。
但是user表里还是插入了一条数据,user_constraint表里并没有插入数据。
这是这次执行的save方法
@Override
public void save(User user) {

User u = this.getHibernateTemplate().load(User.class, 1);
u.setUsername("wangwu");
this.getHibernateTemplate().update(u);

this.getHibernateTemplate().save(user);
throw new RuntimeException();
}小弟第一次发帖,说的不是很清楚,还请见谅。可以联系我qq:575940574这是一个user.hbm.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="edu.whpu.model.User" table="user">
<id name="id" column="id" type="integer">
<generator class="identity"></generator>
</id>
<property name="username" column="username" type="string" />
<property name="password" column="password" type="string" />
<one-to-one name="constraint" class="edu.whpu.model.Constraint" cascade="all"/>
</class>
</hibernate-mapping>
这个是userconstraint.hbm.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="edu.whpu.model.Constraint" table="user_constraint">
<id name="id" column="id" type="integer">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<property name="x" column="x" type="integer" />
<one-to-one name="user" class="edu.whpu.model.User" cascade="all"/>
</class>
</hibernate-mapping>
Beans.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
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-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
            http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<context:annotation-config />
<context:component-scan base-package="edu.whpu" /> <context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 连接池启动时的初始值  -->
<property name="initialSize" value="${jdbc.initialSize}" />
<!-- 连接池的最大值 -->
<property name="maxActive" value="${jdbc.maxActive}" />
<!-- 最大空闲值。当经过一个高峰期时,连接池可以将已经用不到的连接慢慢释放掉一部分,一直减少到maxIdle为止 -->
<property name="maxIdle" value="${jdbc.maxIdle}" />
<!-- 最小空闲值,当连接的连接数少于阙值时,连接池就会预申请一些连接,一面洪峰是来不及申请 -->
<property name="minIdle" value="${jdbc.minIdle}" />
</bean>

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 采用@Transactional注解方式使用事务 -->
<tx:annotation-driven transaction-manager="txManager"/>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />

<property name="mappingResources">
<list>
<value>user.hbm.xml</value>
<value>userconstraint.hbm.xml</value>
</list>
</property>

<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>

<!-- spring集成hibernate时的HibernateTemplate bean配置 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>

<!-- spring关于事务TransactionManager的配置 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>