1

我在 Tomcat 7.0.35(Spring 3.1、Hibernate 3.6.1、JPA 2.0)上运行 Spring + Hibernate Web 应用程序。

这个应用程序有一个页面,它通过 Hibernate 的标准从数据库中获取数据(我知道我不必这样做)。服务层只是简单地调用数据层。这是代码:

    Criteria criteria = sessionFactory.openSession().createCriteria(Article.class); 
    criteria.addOrder(Order.desc("updatedTime"));
    criteria.add(Restrictions.eq("account", acc));
    criteria.add(Restrictions.eq("draft", true));
    criteria.setMaxResults(1);
    Article s = (Article) criteria.uniqueResult();
    return s;

Tomcat 只能处理来自该页面的几个请求,然后它变得无响应。我可以看到浏览器一直在等待服务器响应(Firefox 状态栏显示“等待主机”。)

我没有看到任何错误消息,例如 OutOfMemory 等。浏览器似乎永远等待。

如果我将其更改为 JPA,如下所示:

    @NamedQuery(name = "Article.getMostRecentDraftArticle", query = "select x from Article x where x.account = :account and x.draft = 1 order by x.updatedTime desc"),

......

Query q = getSession().getNamedQuery("Article.getMostRecentDraftArticle");
q.setParameter("account", acc);     
q.setMaxResults(1);
List list = q.list();
if (list.size() == 0) 
    return null;
else 
        return (Article) list.get(0);

然后一切正常。

我使用 Hibernate 的 Criteria API 会出现什么问题?

感谢您的任何意见!

干杯。

4

2 回答 2

2

您还没有关闭会话。看到这个答案:https ://stackoverflow.com/a/4049758/116509

并阅读以下的 javadoc org.hibernate.session

典型的事务应使用以下成语:

 Session sess = factory.openSession();
 Transaction tx;
 try {
     tx = sess.beginTransaction();
     //do some work
     ...
     tx.commit();
 }
 catch (Exception e) {
     if (tx!=null) tx.rollback();
     throw e;
 }
 finally {
     sess.close();
 }
于 2013-04-15T16:00:43.443 回答
1

你能看到休眠日志吗?它会生成查询吗?
无论如何,您可以尝试在sessionFactory.getCurrentSession().flush();下面放一个Article s = (Article) criteria.uniqueResult();

于 2013-04-15T15:28:16.540 回答