刚学的Hibernate求解session的关闭问题

[code="java"]package com.pb.hibernate.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
private static Session session;

private HibernateUtil(){}

static{
    buildSession();
}

private static void buildSession(){
    Configuration config=new Configuration().configure();
    SessionFactory sf=config.buildSessionFactory();
    session=sf.openSession();
}

public static Session getSession(){
    if (session==null) {
        buildSession();
    }
    return session;
}

public static void closeSession(){
    if (session!=null) {
        session.close();
    }
}

}[/code] 这是我们老师写的代码,一个Hibernate的工具类,23行好像有问题,session关闭后不为空,就不会执行buildSession()这个方法,然后就一直报session is closed,求修正

6个回答

建议使用ThreadLocal 来编写hibernate的Session初始化 这也是hibernate官方建议的
[code="java"]
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateFactory {
private static Configuration cfg;
private static SessionFactory sf;
private static ThreadLocal th = new ThreadLocal();

static {
    cfg = new Configuration();
    cfg.configure();
    sf = cfg.buildSessionFactory();
}

public static Session getSession() {
    Session session = th.get();
    if (session == null) {
        session = sf.openSession();
        th.set(session);
    }
    return session;
}

public static void closeSession() {
    Session session = th.get();
    if (session != null) {
        session.close();
        th.set(null);
    }
}

}
[/code]

试试这样修改:
[code="java"]
public static Session getSession(){

if (session==null || !session.isOpen()) {

buildSession();

}

return session;

}
[/code]

airballcz
airballcz 兄弟嘴巴很毒啊,我会继续努力的。
6 年多之前 回复
nimasike
温故而知新666 兄弟 你不懂就别误人子弟了行不
6 年多之前 回复

提示你看一下session关闭后是什么?

[quote]

试试这样修改:

[code="java"]
public static Session getSession(){

if (session==null || !session.isOpen()) {

buildSession();

}

return session;

}
[/code]
14 分钟前
[/quote]

在补充一点

[code="java"]

public static void closeSession(){  
    if (session!=null ) { 
        if(session.isOpen()){
            session.close();
        }
        session=null;
    }  
}  

[/code]

oxcow
oxcow 这段代码 [code="java"]if (session!=null ) { if(session.isOpen()){ session.close(); } session=null; }[/code] 的意思是,需要关闭session时,首先先判断session是否为空,接着判断是否已经关闭(isOpen),如果session不为空,并且是打开的,那么才调用close方法,否则直接释放session对象!
6 年多之前 回复
oxcow
oxcow 因为在调用session.isOpen()时,如果session对象不存在,那不就抛出空指针异常了么! 除非你的程序能保证此处的session一定不为空(也就是存在了),那么就可以像你说的那样,直接调用isopen方法了!
6 年多之前 回复
u010031400
u010031400 为什么不直接判断session.isOpen()如果为false,buildSession(); 如果为true 关闭呢,加上非空判断有啥意义呢?
6 年多之前 回复

这哪个学校的老师写的工具类............

nimasike
温故而知新666 坑啊~~~~
6 年多之前 回复

兄弟 楼上的答案很正确,这里就不做解释了
就只想问一句 你是哪个学校的?简直误人子弟

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问