0

一些背景知识,我在我的 Web 应用程序中使用 JPA/Hibernaate/Spring 我还使用 org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter 和扩展的持久性上下文来处理我的实体。

问题:

  1. 用户单击实体的编辑链接

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

  3. 用户对实体进行更改并点击保存

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

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

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

  7. 服务方法完成后没有任何更改刷新到数据库!!!?

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

4

2 回答 2

1

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

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

  1. 即使对于扩展的持久性上下文,也会创建和关闭实体管理器。也许您在每次调用服务器时打开和关闭它?然后,因为您尝试将实体保存在与创建该实体的服务器不同的调用中,所以实体管理器是一个新的,因此该实体不受管理。

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

于 2013-01-16T12:28:17.663 回答
-1

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

entityManager.persist()

你可以在这里看到为什么要使用持久化而不是合并。

我希望这会有所帮助。

于 2013-01-16T11:48:04.100 回答