application的配置
com.test.service.UserService
PROPAGATION_REQUIRED
<bean id="userService"
class="com.test.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
userServiceProxy代理userService
下面是userServiceImpl中的transaction方法。
public void transaction() throws Exception
{
User user1 = new User();
User user2 = this.userDao.findUserById(2);
user1.setAge(111);
user1.setFirstName("哈哈");
user1.setLastName("哈哈哈");
user2.setLastName("哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈");
this.userDao.addUser(user1);
this.userDao.updateUser(user2);
}
这个方法中,add()会成功。但是update()会出错。所以add()需要回滚。
再把DAO中的方法也贴出来。
public boolean addUser(User user) throws Exception
{
System.out.println(Integer.parseInt(this.getHibernateTemplate().save(user).toString()));
return true;
}
public boolean updateUser(User user) throws Exception
{
this.getHibernateTemplate().update(user);
return true;
}
我测试的结果是add()方法未回滚。但是我若用spring的编程式事务处理transaction方法则可以回滚。配置我都是照书上和网上这样写的啊。不知道为什么就是不回滚,感觉调试的时候根本没用到代理。直接add方法执行了数据库中就有数据了。求大家指点下吧,郁闷死我了。
[b]问题补充:[/b]
一楼的方法早试过,没用。按照二楼兄弟说的方法,把update()方法改掉
public boolean updateUser(User user)
{
throw new RuntimeException();
}
但是还是为回滚。所以我觉得根本未实现事务代理。因为我调试的时候语句刚跳过
this.userDao.addUser(user1); 数据库中就已经更新了。有哪位仁兄有一个spring声明式事务测试回滚成功的小例子,发给我看下。我QQ354571722.谢谢
[b]问题补充:[/b]
public User findUserById(int id)
{
return (User) this.getHibernateTemplate().get(User.class, id);
}
不过这个方法应该没关系吧