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,学习了
------解决方案--------------------还没学到,先看看!