我不熟悉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();
我建议有几个改进:
>
将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();
会话。close()“通过释放JDBC连接并清理结束会话”(HibernateSharedSessionContract
docs)。这并不像我想的那么明确,但我能想到的每一个关于“释放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();
}
如果需要,可以在关闭会话之前在同一会话中运行多个事务。
我目前正在Spring玩番石榴的eventbus,虽然一般功能运行良好,但到目前为止,我遇到了以下问题: 当用户希望更改“行”实体上的数据时,这将在后端服务中照常处理。在这个服务中,数据将首先通过JPA持久化,然后我创建一个“NotificationEvent”,引用已更改的实体。通过EventBus,我将线路参考发送给所有订阅者。 eventbus本身是在后台使用new eventbus()创建
问题内容: 考虑: 提交表单时,如何确保下拉列表中的选定值保持选中状态?此表单位于WordPress(PHP)内部。 问题答案: 为了避免许多if-else结构,让JavaScript自动完成:
我正在处理一些旧的应用程序代码,其中似乎涉及到几个概念,因此我希望能够将它们改进为一个坚实而严格的实践。 基本上,整个代码都用这样的HibernateSessionRequest estFilter包装 然后,有一个拦截器,做这样的事情 然后还有更多的业务逻辑代码,包括更多的初始事务和会话清除等。 那么,问题是: 当在同一会话中多次调用beginTransaction时会发生什么 非常感谢。
问题内容: 事务成功或回滚后,我需要调用某些方法。我正在使用 该应用程序使用一些外部Web服务,这些内部Web服务在回滚内部事务时需要“清除”。有没有办法在不使用声明式事务管理的情况下完成此操作。 问题答案: 在Hibernate中,您可以扩展和覆盖 方法并将其注册在 或中。 在Spring中,您可以使用扩展,覆盖和注册 。 编辑 使用Spring Aop向所有带注释的方法添加同步的示例
一些背景知识,我在我的web应用程序中使用JPA/Hibernate/Spring,我也使用org。springframework。orm。jpa。支持OpenEntityManagerViewFilter和用于处理实体的扩展持久性上下文。 问题: > 使用find方法从数据库加载实体,实体存储在会话中 用户更改实体并点击保存 用户更改反映在会话中存储的实体上(在控制器中) 实体被发送到服务类中的
我正在使用手动事务时插入/更新3个表。我想在事务提交后立即插入到历史表中。这意味着有3个操作(针对每个表),只有在提交这些操作之后,我才希望调用一个方法。 这是我的代码: 有什么post commit方法吗?如何在提交之后而不是持久之后调用方法?