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语句里面吗?

解决方案 »

  1.   

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

  2.   

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

  3.   


     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();
            }
      

  4.   

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

  5.   

    一个就够了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();
            }
      

  6.   

    一个就够,使用前连接,使用后关闭。不需要每次都打开关闭,这样耗时耗存
    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();
      

  7.   

    一个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();
      

  8.   

    事务别放在for each 里就行了
    相当于你每次循环都要处理事务。
      

  9.   

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

    }
    tx.commit();
    s.close();不是更好?
      

  10.   

    session只用开启一个,然后你再进行持久层的操作就可以了。
    如果你只是查询的话,开不开事务都是可以的。