Sping+Hibernate中的事务控制问题
最近在学习Hibernate+Spring, 配置事务如下:
1.Spring中的事务设置
applicationContext.xml
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
2.定义POJO和hbm.xml
略。
3.定义Service
public static final String DisallowedMessage = "Hello, hack";
//使用声明式事务
@Transactional
public void save(Message message){
long msgId = (Long)sessionFactory.getCurrentSession().save(message);
System.out.println("generate message id:" + msgId);
//为了测试事务, 在保存后,再检查消息
if(DisallowedMessage.equals(message.getText())){
throw new RuntimeException("reject a bad message.");
}
}
4.单元测试代码如下
@Test
public void testSaveWithRollback(){
String text = "Hello Batman";
try{
//正常消息
Message message = new Message(text);
messageService.save(message);
//异常消息
message = new Message(MessageService.DisallowedMessage);
messageService.save(message);
fail("Not rollback when occuring RuntimeException!");
}catch (Exception rex){
}
List messaes = messageService.findAllMessages();
for(Iterator iter = messaes.iterator(); iter.hasNext();){
Message loadedMsg = (Message) iter.next();
if(loadedMsg.getText().equals(MessageService.DisallowedMessage) ||
loadedMsg.getText().equals(text)){
fail("Found bad text!");
}
}
}
测试结果为无法通过。 报“Found bad text”
期望是: 保存时,事务回滚。 正常消息和异常消息均无法保存。
实际为: 正常消息保存成功, 异常消息在数据库中无记录。
问题是,Spring事务是以@Transactional注解为边界, 进入时打开事务, 离开时结束事务吗? 如此怎么可以保证多个方法的事务一致性。
相信是什么地方理解错了,或者配置有误, 还请能者解惑。
(代码中使用的是Hibernate3的原生API, 版本为3.6.10.Final)
[解决办法]
正常情况下
这2次save会写在service里面
直接给这个service方法加上@Transactional注解就好了
那么就是你期望的结果
不必纠结了