代码如下:
public void sava(Employee emp) {
Session session = null;
Transaction tx = null;
try {
session = HibernaterUtil.getSesssion();
tx = session.beginTransaction();
session.save(emp);
tx.commit();
} catch (Exception e) {
if(tx!=null)tx.rollback();
e.printStackTrace();
} finally {
session.close();//疑惑
}
}
public class HibernaterUtil {
private static SessionFactory sf;
static {
sf = new Configuration().configure().buildSessionFactory();
}
public static Session getSesssion() {
return sf.openSession();
}
}
session.close()。突然对这句语句有点疑惑,为什么不要先判断session!=null,而是直接就关闭了?
------解决思路----------------------
应该判断下 ,
try块中的异常. 因为有catch的存在,只能在控制台里看到,
finally块的内容不管try块中是否有错误,都会执行 , 而当session是null的话, 就会报空指针异常
------解决思路----------------------
由于你使用的是openSession,所以最后应该判断session是否为空并调用close方法,否则会出空指针异常。。。
------解决思路----------------------
不管如何,finally最终都会执行的,应该加上空判断,会让程序更健壮一点
------解决思路----------------------
因此你前面已经new了一个session出来,如果session为空的话,try{}代码块里就会报错。如果session不为空,但是后面执行save报错了,这个时候你的异常被捕获到,运行到这个地方停止了,但是session还是打开着,如果你不关闭session又继续执行其他操作的话,系统性能会降低。
所以用你这种写法的话,session要关闭,而又不必在关闭前判断session是否为空
------解决思路----------------------
应该在finally里做一下判断的,为了保证程序的健壮性。
if(s!=null && s.isOpen()){
s.close();
}
public class HibernaterUtil {
private static SessionFactory sf;
static {
sf = new Configuration().configure().buildSessionFactory();
}
public static Session getSesssion() {
Session s = null;
if(sf!=null){
s = sf.openSession();
}
return s;
}
}
------解决思路----------------------
[晕死,一个用户只能连续回复三次,这是小号]
嗯,看到官方文档中没有关闭,然后又没搞懂事务与session的关系。以为关闭了事物,该session就无所谓了,或者其它的设置之类的原因。弄了良久,到现在都没理清头绪。现在都有点怀疑是写这个文档的人有点偷懒,没有进行非空判断了
------解决思路----------------------
楼主没错,是要加判断!
只不过一般session都不会被关闭,所以就没怎么出错。
------解决思路----------------------
我觉得是这样的,如果session为空,即 session = HibernaterUtil.getSesssion(); 有问题,也就是工具类 HibernaterUtil?的 sf.openSession() 有问题,因为你用的是 openSession 而不是 currentSession ,所以 openSession 报错的根本原因应该是 sf 为空,也就是数据库连接有问题,因此我觉得你应该在工具类 HibernaterUtil?的静态块里加上 try{}catch,也就是
static {
try {
sf = new Configuration().configure().buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
}