首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

Sping+Hibernate中的事务控制有关问题

2013-09-05 
Sping+Hibernate中的事务控制问题最近在学习Hibernate+Spring, 配置事务如下:1.Spring中的事务设置applica

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注解就好了
那么就是你期望的结果
不必纠结了

热点排行