孙钰佳的博客

转载本BLOG的原创文章请注明作者和出处,谢谢 !

原创 hibernate3保存对象为什么必须使用事务收藏

    今天在csdn上看到一个特别有趣的话题,hibernate3为什么必须使用事务才能保存对象,我相信这个问题对很多人来说都非常困惑包括我自己,于是挂上hibernate源码,一直跟踪最底层,也没发现什么,然而正是因为没用发现什么才点醒了我,回忆多年前使用经典jdbc的场景,那时候使用事务必须自己手工控制conn.setAutoCommit(false); 才行。而现在如果我们要正常使用hibernate3保存对象的话要使用事务处理才行:

	public static void main(String[] args) throws Exception {
		SessionFactory sf = HibernateSessionFactory.getSessionFactory();
		Session session = sf.openSession();
		session.beginTransaction();
		User u = new User();
		u.setName("aaa");
		session.save(u);
		session.getTransaction().commit();
	}
使用spring声明式事务本质上和上面是一样的,spring只不过是利用了动态代理而已。 从上面代码可以看到beginTransaction非常像很久以前我们写的conn.setAutoCommit(false); 而session.getTransaction().commit();则是对应conn.commit();那会不会是因为conn已经默认是false了呢
System.out.println(session.connection().getAutoCommit());//经测试果然如此。经测试下面代码可以成功保存对象。
		SessionFactory sf = HibernateSessionFactory.getSessionFactory();
		Session session = sf.openSession();
		System.out.println(session.connection().getAutoCommit());
		session.connection().setAutoCommit(true);
		User u = new User();
		u.setName("aaa");
		session.save(u);

只要修改conn默认的提交方式就可以了,为了进一步验证这个问题其实和hibernate是无关的,写了如下测试代码,同样可以正常的保存对象。

public static void main(String[] args) throws Exception {
		Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
		Connection conn = DriverManager.getConnection(
				"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs",
				"sa", "11111111");
		SessionFactory sf = HibernateSessionFactory.getSessionFactory();
		Session session = sf.openSession(conn);
		System.out.println(session.connection().getAutoCommit());
		// session.connection().setAutoCommit(true);
		User u = new User();
		u.setName("aaa");
		session.save(u);
	}

其实我觉得必须使用事务才能保存对象是大家对hibernate的误解,目前流行的数据库连接池默认的情况下都是conn自动提交为false的。很多连接池还可以灵活的配置,我们还是要还hibernate清白的。这是取决于数据库连接池的配置。

发表于 @ 2008年06月07日 14:18:00|评论(loading...)|收藏

新一篇: 查看虚拟机指令 | 旧一篇: junit测试的一点心得

用户操作
[即时聊天] [发私信] [加为好友]
孙钰佳
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
孙钰佳的公告
 

 

声明:转载本BLOG的原创文章请注明作者和出处,谢谢!
站内搜索:
文章分类
收藏
    参考手册
    51chm
    CSS手册
    DHTML手册
    HTML手册
    J2SE API
    JScript手册
    MSDN
    SQL手册
    满江红RedSaga
    技术社区
    BEA dev2dev(RSS)
    Blueidea(RSS)
    IBM developerWorks(RSS)
    Javaeye(RSS)
    Matrix(RSS)
    Sun Java Forum (RSS)
    友情链接
    ZangXT的专栏
    堕落佛的博客
    老紫竹的专栏
    存档
    Csdn Blog version 3.1a
    Copyright © 孙钰佳