当前位置: 首页 > 知识库问答 >
问题:

事务提交后未保存实体

荣德厚
2023-03-14

一些背景知识,我在我的web应用程序中使用JPA/Hibernate/Spring,我也使用org。springframework。orm。jpa。支持OpenEntityManagerViewFilter和用于处理实体的扩展持久性上下文。

问题:

>

使用find方法从数据库加载实体,实体存储在会话中

用户更改实体并点击保存

用户更改反映在会话中存储的实体上(在控制器中)

实体被发送到服务类中的方法(用@Transactional注释)

服务类中不会发生对实体(或任何其他实体)的更改(它会执行一些其他与持久性无关的事情)

完成服务方法后,不会刷新数据库中的任何更改!!!?

注意:服务类是一个spring组件,我调试了为其创建的spring代理,当调用带有@Transactional注释的服务方法时,我看到spring在服务方法调用之前创建了一个新事务,我还看到它成功提交了事务。根据我的理解,即使对实体的更改没有发生在事务边界中,它仍然应该刷新到数据库中。为什么更改没有刷新?!

共有2个答案

葛泳
2023-03-14

如果用户更改是在您的服务层之外进行的,则更改不会自动持久化,除非您在服务层内调用持久化:

entityManager.persist()

您可以在这里看到为什么要在合并上使用持久化。

我希望这有帮助。

淳于健
2023-03-14

对于要刷新的实体,必须对其进行管理。实体可能已分离。

在这种情况下,我可以想出两个可能的原因将其分离:

>

在对服务器的这些调用之间序列化实体。当实体被序列化时,它将被分离。这很容易发生,因为服务器经常在调用之间将会话数据写入磁盘。

 类似资料:
  • 我在我的项目中做过类似的事情。我手动回滚事务,为此我插入了try-catch块并手动回滚catch块中的事务。现在我从method1调用method2,并将对象保存到method2()中的数据库中,但它不会将对象保存到数据库中。 我只是想知道什么是可能的解决方案,保存对象在方法2()在方法1()的faliure。 提前感谢。

  • 我目前正在Spring玩番石榴的eventbus,虽然一般功能运行良好,但到目前为止,我遇到了以下问题: 当用户希望更改“行”实体上的数据时,这将在后端服务中照常处理。在这个服务中,数据将首先通过JPA持久化,然后我创建一个“NotificationEvent”,引用已更改的实体。通过EventBus,我将线路参考发送给所有订阅者。 eventbus本身是在后台使用new eventbus()创建

  • 以下是使用事务教程中描述的提交和回滚的代码示例。 此示例代码是基于前面章节中完成的环境和数据库设置编写的。 复制并将以下示例代码保存到:CommitAndRollback.java 中,编译并运行如下 - 编译并运行结果如下 -

  • 我正在使用手动事务时插入/更新3个表。我想在事务提交后立即插入到历史表中。这意味着有3个操作(针对每个表),只有在提交这些操作之后,我才希望调用一个方法。 这是我的代码: 有什么post commit方法吗?如何在提交之后而不是持久之后调用方法?

  • 我正在尝试构建一个带有按钮的PHP计算器。我的问题之一是我不能有超过一个数字的值。例如,当我尝试输入一个值(例如33)时,文本框中的结果变为3,因为当我对所有数字使用submit时,页面被刷新。只能使用一个PHP页面。这个解决方案是向我建议的,但它不能解决我的问题,因为它使用了多个页面。此外,一个以上的数字似乎不起作用。 另外,这里是我的HTML的一个示例 这是我的用户界面的图片,一个我的用户界面

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