日期:2014-05-20  浏览次数:20688 次

spring的事物问题?
这是我的DAO.
Java code

    public void insert(BaseEntity entity) {
        // TODO Auto-generated method stub
        this.getHibernateTemplate().save(entity);
    }


这是我的测试。
Java code

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BeanFactory factory=new ClassPathXmlApplicationContext("applicationContext.xml");
        GroupDAO gd=(GroupDAO)factory.getBean("GroupDAO");
        Group g=new Group();
        g.setCanDelete(new Boolean(true));
        g.setCanLock(new Boolean(true));
        g.setCanLogon(new Boolean(true));
        g.setCanPrime(new Boolean(true));
        g.setCanPublish(new Boolean(true));
        g.setCanReply(new Boolean(true));
        g.setCanTop(new Boolean(true));
        g.setDescription("description");
        g.setGroupName("admin");
        gd.insert(g);
    }


运行完查看数据库发现插入成功,可是我的这里没有调用像begin(),commit()之类的方法。
而且我也没有在XML里配置事务。
以前单独使用HIBERNATE时要先begin(),之后commit(),spring的getHibernateTemplate().save(entity)难道封装了吗?

------解决方案--------------------

------解决方案--------------------
hibernate用的很少,但理论上和jdk中的jdbc的处理机制是一样地,
若你再调用save之前开启了事务,那么再save之后若没有commit,则此事务是不会提交地,也不会更改数据库中的数据,并因此会造成锁表或锁行(锁表或锁行跟数据库的设计有关)。
若你在调用save之前没有开启事务,则会直接提交。
我没有去看jdk的源代码,只是猜测,再jdk中有对事务的判断,若外部开启了,等需要提交,若没有开启在save方法内部就自己提交了。
有兴趣的通知可以自己看看源代码是否如此O(∩_∩)O
------解决方案--------------------
http://www.javaeye.com/topic/78674
看看这篇怎么样
------解决方案--------------------
原理是这样:
spring的getHibernateTemplate().save()这个方法内部已经调用了flush了,就相当于
session.save()
session.flush()
这两个被spring的getHibernateTemplate().save()集成进来了

还有一点就是在hibernate.cfg.xml中配置了<property name="connection.autocommit">true</property>
表示:事务可以提交和flush也可以提交

如果设置了<property name="connection.autocommit">false</property>,这个也是hibernate的默认设置
表示:只有事务提交才能提交到数据库,flush不好使
------解决方案--------------------
up,学习了
------解决方案--------------------
还没学到,先看看!