这样创建session对不对?
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(); }
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放到循环中处理)
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 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(); }
[解决办法]
一个就够,使用前连接,使用后关闭。不需要每次都打开关闭,这样耗时耗存
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();
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();
不是更好?
[解决办法]
session只用开启一个,然后你再进行持久层的操作就可以了。
如果你只是查询的话,开不开事务都是可以的。