首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Servlet和Hibernate -不会打开会话

Servlet和Hibernate -不会打开会话
EN

Stack Overflow用户
提问于 2014-03-26 01:07:41
回答 2查看 778关注 0票数 0

我有一个DAO类,它通过Hibernate与数据库连接:

代码语言:javascript
复制
public class ChartDAO {

public static ChartData getChartData(){
    Session session = null;
    List data;
    try {
        try {
            session = HibUtil.getSessionFactory().openSession();
            Transaction tx = session.beginTransaction();
            data = session.createQuery("FROM ChartData").list();
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            data = new ArrayList();
            data.add(new ChartData());
        }
    } finally {
        session.disconnect();
        session.close();
        try {
            HibUtil.close();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
    ChartData chartData = (ChartData) data.get(0);
    return chartData;
}

public static void main(String[] args) throws Exception{
    ChartData cd = getChartData();
} 
}

当我运行调用getChartData()的main方法时,一切都运行正常(在调试器中签入-打开会话并检索数据)。

但是,当我试图从servlet调用相同的方法时,数据并没有被检索到。我检查了调试器-当尝试打开hibernate会话时,它“冻结”了一段时间,然后立即跳到“finally”块。

我做错了什么?

谢谢。

编辑:下面是我的HibUtil:

代码语言:javascript
复制
public class HibUtil {

private static ServiceRegistry serviceRegistry;
private static final SessionFactory sessionFactory;

static {
    try {
        Configuration configuration = new Configuration();
        configuration.configure();
        serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    } catch (Throwable ex) { 
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}

public static void close() throws Exception{
    if(serviceRegistry!= null) {
        StandardServiceRegistryBuilder.destroy(serviceRegistry);
    }
}
}

更新:这是我尝试从servlet调用方法时的Apache Tomcat日志:

代码语言:javascript
复制
mar 25, 2014 6:42:41 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [DataProvider] in context with path [/SHJS] threw exception
java.lang.NullPointerException
    at org.mb.DataProvider.processRequest(DataProvider.java:53)
    at org.mb.DataProvider.doGet(DataProvider.java:83)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
EN

回答 2

Stack Overflow用户

发布于 2014-03-26 01:29:17

使用会话创建连接

代码语言:javascript
复制
 Connection connection     = session.connection();

然后使用connection.as创建您的查询,因为您没有创建连接,所以它可能无法工作。您也可以像这样使用Annotation Configuration

代码语言:javascript
复制
private static SessionFactory buildSessionFactory() {
    try {
        // Create the SessionFactory from hibernate.cfg.xml
        return new AnnotationConfiguration().configure()
                .buildSessionFactory();
    } catch (Throwable ex) {
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}
public static SessionFactory getSessionFactory() {
    return sessionFactory;
}

把这个叫作

代码语言:javascript
复制
Session session  = HibernateUtil.getSessionFactory().openSession();

为了进行session.then事务,然后进行连接,因此on.this对我来说工作得很好,你可以尝试一下。

票数 0
EN

Stack Overflow用户

发布于 2014-03-26 23:46:07

试试这个:

代码语言:javascript
复制
new Configuration().configure().buildSessionFactory();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22641639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档