java Hibernate错误“数据库已锁定”。如何正确关闭会话?
在我的应用程序中,我打开会话,创建条件,但不关闭它。然后在另一种方法中,我再次打开会话,更新对象并在tr.commit()
上接收database is locked
如果我把session.close()
放在第一个实例中,我会收到
could not initialize proxy - no Session.
如何正确关闭和打开会话?或者我需要将代理对象复制到我创建的对象,然后close()
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tr=session.beginTransaction();
Criteria criteria = session.createCriteria(MyDocument.class);
criteria.add(Expression.like("isMainDoc", 1));
List docs = criteria.list();
tr.commit();
session.close();
我是个十足的乞丐。我使用sqlite。任何帮助都将不胜感激。提前谢谢
# 1 楼答案
使用hibernate transactions读取API here时,请按照以下步骤操作
# 2 楼答案
原因
当您试图访问查询返回的
MyDocument
类实例的属性时,可能会出现错误默认情况下,Hibernate是惰性的。它返回对象的
proxy
,而不是在访问引用属性时访问数据库。此行为可在需要时被覆盖。 始终记住,无法初始化代理-当代码尝试访问proxy
属性(通过点击数据库)并发现会话不可用时,不会收到任何会话(由于Hibernate使用此接口访问数据库,因此需要会话)解决方案
当Hibernate试图加载尚未加载的对象时,请确保会话处于打开状态。你是怎么做到的
(简单地说)Hibernate有两个学派:
我想让你复习一些主题,比如Hibernate中的工作单元。Hibernate提供了一个极好的界面来定义数据库访问的边界。必须在这些边界之间访问(读/写)数据Check Here
hibernate.current_session_context_class
在hibernate配置中,它可以采用jta | thread | managed | custom的值。班此变量定义Session
的工作单位最后,但最重要的是,尝试使用Contextual Sessions(您一定遇到过
.getCurrentSession()
这有助于您获得每次在代码中任何位置打开的相同会话。Hibernate在幕后处理所有事情希望这个答案能为您提供一个指导,帮助您正确使用Hibernate,而不仅仅是解决这个特定问题
# 3 楼答案
Hibernate会话通常绑定到线程
因此,也许您应该重新构造代码,以便在处理开始时获得会话(例如,在web应用程序的ServletFilter实例中)
然后在每个方法中,您都可以使用相同的会话对象来启动新事务(当然,还可以结束事务)
编辑:通常,在处理完成后关闭会话(在web应用中,也可以在同一个ServletFilter中) 谷歌:“在视图中打开会话”模式