日期:2014-05-19  浏览次数:20704 次

这样创建session对不对?
Java code
List<User> users = findAllUser();
        for(User u : users) {
            Session s = HibernateSessionFactory.getSession();
            Transaction tx = s.beginTransaction();
            System.out.println(u.getName());
            s.save(new Info(null, msg, u, false, new Date(), from));
            tx.commit();
            s.close();
        }


都必须在for语句里面吗?

------解决方案--------------------
不需要啊。session是指跟数据库的一次会话。这次会话可能会包含很多操作


------解决方案--------------------
不需要再for循环里,你把session放在for循环外也可以,至于session的创建有多种方式创建。
这里放在for循环里是每次增加数据都重新创建一次session,然后关闭session。完全没有必要这样做,放在外面完全ok。
------解决方案--------------------
Java code

 Session s = HibernateSessionFactory.getSession();
List<User> users = findAllUser();
        for(User u : users) {
            Transaction tx = s.beginTransaction();
            System.out.println(u.getName());
            s.save(new Info(null, msg, u, false, new Date(), from));
            tx.commit();
            s.close();
        }

------解决方案--------------------
正解哇
------解决方案--------------------
楼主要好好理解Hibernate中session的含义,知其所以然,自然就知道在什么场合下如何处理对象了。
session可以理解成客户端和数据库的一次会话,多个事物可以含在这次会话中。
一般在多用户场景下,我们会封装一下把session交给数据库连接池(百度一下数据库连接池)去管理。
成熟的数据库连接池很多,比如c3p0等等。
下面把多个用户保存作为一个事物来处理(如果其中任何一个用户保存失败,则抛出异常,之前的用户也不会保存成功,保证事物的完整性,如果你不在乎事物,则可以把tx放到循环中处理)
Java code

 Session s = HibernateSessionFactory.getSession();
Transaction tx = s.beginTransaction();
List<User> users = findAllUser();
        for(User u : users) {
            System.out.println(u.getName());
            s.save(new Info(null, msg, u, false, new Date(), from));
        }
tx.commit();
s.close();

------解决方案--------------------
一个就够了
Java code
Session s = HibernateSessionFactory.getSession();
List<User> users = findAllUser();
        for(User u : users) {
            Transaction tx = s.beginTransaction();
            System.out.println(u.getName());
            s.save(new Info(null, msg, u, false, new Date(), from));
            tx.commit();
            s.close();
        }

------解决方案--------------------
一个就够,使用前连接,使用后关闭。不需要每次都打开关闭,这样耗时耗存
Java code
Session s = HibernateSessionFactory.getSession();
Transaction tx = s.beginTransaction();
List<User> users = findAllUser();
        for(User u : users) {
            System.out.println(u.getName());
            s.save(new Info(null, msg, u, false, new Date(), from));
        }
tx.commit();
s.close();

------解决方案--------------------
一个session就够了,一级缓存,不需要创建那么多次,放在for外面,开启事务根据你的代码,里外都可以放的
Session s = HibernateSessionFactory.getSession()
Transaction tx = s.beginTransaction();
List<User> users = findAllUser();
for(User u : users) {
System.out.println(u.getName());
s.save(new Info(null, msg, u, false, new Date(), from));
}
tx.commit();
s.close();
------解决方案--------------------
事务别放在for each 里就行了
相当于你每次循环都要处理事务。

------解决方案--------------------
Session s = HibernateSessionFactory.getSession();
List<User> users = findAllUser();
Transaction tx = s.beginTransaction();