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

hibernate要求一个session一个事务吗?
按照李兴华老师的视频教程,成功配置hibernate并且得到了跟数据库对应的User这个POJO类(其中有getter和setter函数),和与User对应的操作类UserOperate类,其中有插入删除等操作,在主函数中测试的时候也能正常运行,但是我忽然想用一个循环向数据库中添加数据的时候发现问题,hibernate只往数据库中添加了一条信息,我的代码如下:
Java code
User user=new User();
        
        UserOperate useop=new UserOperate()
        
        for(int i=0;i<10;i++){
            user.setName("dingding"+String.valueOf(i));
            user.setPassword("newflypig"+String.valueOf(i));
            useop.insert(user);
        }

测试结果为,数据库中添加了循环语句的最后一个user也就是dingding9-newflypig9这组信息。初步怀疑是事务和session的问题,但是刚接触hibernate,不懂之间的关系,于是改变代码为:
Java code
User user=new User();
        
        for(int i=0;i<10;i++){
            user.setName("dingding"+String.valueOf(i));
            user.setPassword("newflypig"+String.valueOf(i));
            new UserOperate().insert(user);
        }


这下OK了,十个数据全部添加进去,可是细心一看,循环中每次都要创建一个session实例,感觉心里挺别扭的,明显效率降低了呀,难道hibernate规定一个session只可以完成一次事务吗,对了我的UserOperate类中的insert函数是这样的:
Java code
public void insert(User user) {
        Transaction trans=this.session.beginTransaction();
        this.session.save(user);
        trans.commit();
        session.close();
    }


请各位用hibernate的朋友帮忙解释一下,并且分析一下一个session和多个session实例运行的效率,谢谢了


------解决方案--------------------
在你的程序里User user=new User();此时的user的状态为瞬时状态,即user还未与session进行关联。你new UserOperate对象同时即声明了一个session。 当你调用UserOperateUser.insert(user)时即将此user对象同当前的session进行关联此时的user对象即为持久状态,因此在你循环中不管对此user操作多少次仅是对关联后的user进行修改。当你在循环中 new UserOperate().insert(user)时你所使用的user对象所关联的是不同session。因此你成功的插入了10条数据。
如果你使用循环的话建议你对原有程序进行修改
Transaction.begin();
for(int i=0;i<10;i++){
User user=new User();
user.setName("dingding"+String.valueOf(i));
user.setPassword("newflypig");
session.save(user);
}

Transaction.commit();