Java 不提交Hibernate Select事务的条件

Java 不提交Hibernate Select事务的条件,java,hibernate,transactions,Java,Hibernate,Transactions,我不熟悉Hibernate,并且继承了使用它的代码库。未定义自动提交,因此默认情况下为false。不过,根据我提出的其他问题,答案表明,最佳做法是对代码进行标定,以便在开始事务时始终应该提交()或回滚()(多亏了Apostolos)。 此代码库对Select语句使用以下代码中的格式。我打算将任何新代码正确地划分为commit()或rollback(),但我只是好奇使用下面的模型会产生什么后果。应用程序已经并将继续正常工作,但我想了解现有代码是否存在任何问题 this.session = Hibe

我不熟悉Hibernate,并且继承了使用它的代码库。未定义自动提交,因此默认情况下为false。不过,根据我提出的其他问题,答案表明,最佳做法是对代码进行标定,以便在开始事务时始终应该提交()或回滚()(多亏了Apostolos)。 此代码库对Select语句使用以下代码中的格式。我打算将任何新代码正确地划分为commit()或rollback(),但我只是好奇使用下面的模型会产生什么后果。应用程序已经并将继续正常工作,但我想了解现有代码是否存在任何问题

this.session = HibernateUtil.getSessionFactory().getCurrentSession();    
Transaction tx = session.beginTransaction();
session.clear();
entityReturned = (MultipleKeyTable) session.get(MultipleKeyTable.class, entityId);
session.close();
Session.close()
“通过释放JDBC连接并清理来结束会话”()。这并不像我希望的那样明确,但我所能想到的每一个关于“释放JDBC连接”的合理解释都意味着以某种方式结束任何打开的事务。尽管如此,仅仅关闭会话而不是显式结束事务充其量也是草率的

值得一提的是,推荐以下成语:

Session sess = factory.openSession();
Transaction tx = null;
try {
    tx = sess.beginTransaction();
    //do some work
    ...
    tx.commit();
}
catch (Exception e) {
    if (tx!=null) tx.rollback();
    throw e;
}
finally {
    sess.close();
}

如果需要,您可以在关闭会话之前在同一会话中运行多个事务。

我建议进行以下几项改进:

  • SessionFactory存储为类成员的会话:因为您在完成任务后关闭了会话对象,所以无法重用此实例,因此您将需要可以从SessionFactory检索的新实例

  • 不要调用clear()方法:因为您正在使用当前会话对象,所以调用clear()可能会删除处于持久性上下文中但尚未刷新到数据库中的所有对象,因此您可能会丢失数据

  • 完成工作后提交或回滚事务

  • 因此,代码必须是:

         this.sessionFactory = HibernateUtil.getSessionFactory();
         Session session = this.sessionFactory.getCurrentSession();    
         Transaction tx = session.beginTransaction();
    
         entityReturned = (MultipleKeyTable) session.get(MultipleKeyTable.class, enti
    
         transaction.commit();
         session.close();
    

    谢谢你的回答。在commit()之后调用close()将引发异常,尽管这是因为在commit()调用中会话正在关闭。