有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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。任何帮助都将不胜感激。提前谢谢


共 (3) 个答案

  1. # 1 楼答案

    使用hibernate transactions读取API here时,请按照以下步骤操作

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    
    //Or any other operation.
    session.save(a);
    
    tx.commit();
    session.close();
    
  2. # 2 楼答案

    原因

    当您试图访问查询返回的MyDocument类实例的属性时,可能会出现错误

    默认情况下,Hibernate是惰性的。它返回对象的proxy,而不是在访问引用属性时访问数据库。此行为可在需要时被覆盖。 始终记住,无法初始化代理-当代码尝试访问proxy属性(通过点击数据库)并发现会话不可用时,不会收到任何会话(由于Hibernate使用此接口访问数据库,因此需要会话)

    解决方案

    当Hibernate试图加载尚未加载的对象时,请确保会话处于打开状态。你是怎么做到的

    (简单地说)Hibernate有两个学派:

    1. 在关闭会话或之前获取可能访问的所有数据
    2. 在处理对象的整个过程中保持会话处于打开状态

    我想让你复习一些主题,比如Hibernate中的工作单元。Hibernate提供了一个极好的界面来定义数据库访问的边界。必须在这些边界之间访问(读/写)数据Check Here

    hibernate.current_session_context_class在hibernate配置中,它可以采用jta | thread | managed | custom的值。班此变量定义Session的工作单位

    最后,但最重要的是,尝试使用Contextual Sessions(您一定遇到过.getCurrentSession() 这有助于您获得每次在代码中任何位置打开的相同会话。Hibernate在幕后处理所有事情

    希望这个答案能为您提供一个指导,帮助您正确使用Hibernate,而不仅仅是解决这个特定问题

  3. # 3 楼答案

    Hibernate会话通常绑定到线程

    因此,也许您应该重新构造代码,以便在处理开始时获得会话(例如,在web应用程序的ServletFilter实例中)

    然后在每个方法中,您都可以使用相同的会话对象来启动新事务(当然,还可以结束事务)

    public void doWork(){
      Transaction tx = null;
       try{
         tx = session.beginTransaction();  
       }catch(){
       } finally {
         // if tx != null then.. close transaction, or rollback?
       }
    }
    

    编辑:通常,在处理完成后关闭会话(在web应用中,也可以在同一个ServletFilter中) 谷歌:“在视图中打开会话”模式