commit之后关闭Hibernate Session / EntityManager

问题描述

我今天刚刚学习了如何使用Hibernate,并且正在搞乱一个小型数据库。

public class HibernateQuery {

    private static final SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
    private static final Session session = sessionFactory.getCurrentSession();

    public static void main(String[] args) {
        queryA();
        queryB();
        session.close();
        sessionFactory.close();
    }

    public static void queryA() {
        Transaction tx = session.beginTransaction();
        List<GradesJPA> lst = session.createQuery("from GradesJPA",GradesJPA.class).list();
        for(GradesJPA each : lst) {
            System.out.println(each);
        }
        tx.commit();
    }

    public static void queryB() {
        Transaction tx = session.beginTransaction();
        List<String> lst = session.createQuery("select g.className from GradesJPA g",String.class).list();
        for(String each : lst) {
            System.out.println(each);
        }
        tx.commit();
    }
}

成功完成第一个查询后,出现错误Session/EntityManager is closed。解决问题的方法很简单。为每个session而不是为班级声明一个query()。但是,有人可以向我解释为什么吗? (另外,您能告诉我是否需要关闭在每种方法中创建的单个sessions吗?)

根据我的阅读,提交transaction不会关闭sessionDoes committing transaction close session?

从文档中,我唯一了解的是session-per-operation反模式,但是不知何故,我被迫在每个session之后打开一个新的query()

还有一个建议session/entitymanager is closed,在Hibernate论坛上还有一个建议,由于并发问题,建议不要在全班级session进行。但是我怀疑我的代码没有与其他任何东西并行运行。

这是显示的全部错误:

Exception in thread "main" java.lang.IllegalStateException: Session/EntityManager is closed
    at org.hibernate.internal.AbstractSharedSessionContract.checkOpen(AbstractSharedSessionContract.java:360)
    at org.hibernate.engine.spi.SharedSessionContractImplementor.checkOpen(SharedSessionContractImplementor.java:139)
    at org.hibernate.internal.AbstractSharedSessionContract.beginTransaction(AbstractSharedSessionContract.java:465)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:350)
    at com.sun.proxy.$Proxy33.beginTransaction(Unknown Source)
    at hibernate.HibernateQuery.queryB(HibernateQuery.java:38)
    at hibernate.HibernateQuery.main(HibernateQuery.java:18)

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...