当你第一次尝试使用会话时,Hibernate会创建一个和 将它附加到您的本地线程。当你提交交易时 session Hibernate将自动关闭会话意味着它 不能重复使用。 - 从site
得到这个引用
这是我的代码的样子,每次我提交交易时我都可以关闭hibernateSession
:
Session session = HibernateUtil.getSessionFactory().openSession();
session.setFlushMode(FlushMode.AUTO);
session.beginTransaction();
session.getTransaction().commit();
session.close();
我的所有代码都运行正常,但是存在问题: 例如,如果我在数据库中添加行,保存成功,如果我在1-10秒后添加另一个。发生Hibernate异常,说Session已关闭。但如果我再加一个,如果我等到1分钟,这不会发生。这在我的代码或服务器连接速度有点错误(我确实有这个想法,因为我的java servlet代码的更新有时会延迟)?有什么想法吗?
答案 0 :(得分:1)
通过在需要提交事务时打开会话,您做了一件好事,但是:
一般来说,hibernate管理所有会话结束和打开,所以如果你需要承担责任,你需要在hibernate配置文件中更改以下内容: hibernate.cfg.xml
物业名称: current_session_context_class
属性值: managed
要创建会话并开始交易,您需要以下代码:
org.hibernate.classic.Session session = HibernateUtil.getSessionFactory().openSession();
session.setFlushMode(FlushMode.MANUAL);
ManagedSessionContext.bind(session);
session.beginTransaction();
要提交交易,请执行以下操作:
ManagedSessionContext.unbind(HibernateUtil.getSessionFactory());
session.flush();
session.getTransaction().commit();
session.close();
您可以100%确定无论何时提交,都可以从您的线程中取消附加会话,而gc会负责处理。
因此,每当您需要执行另一个事务时,您需要再次运行代码的第一部分。
答案 1 :(得分:0)
尝试使用.getCurrentSession()
代替openSession()
答案 2 :(得分:0)
而不是使用
Session session = HibernateUtil.getSessionFactory().openSession();
使用
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
要在提交事务时自动关闭会话,请在hibernate配置
中将属性设置为truehibernate.transaction.auto_close_session=true