gpt4 book ai didi

java - Play Framework : merge action only works in the Controller that triggered it

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:53:49 25 4
gpt4 key购买 nike

我有一个简单的 Play 应用程序用于测试。我有 2 个 Controller ,一个是显示条目列表的“ListController”。每个条目都有一个“编辑”链接,该链接转到“EditController”。 “EditController”显示带有条目现有数据的 html 表单,提交按钮将该数据发布到“EditController”中的另一个方法,该方法将数据保存到 db 并在表单中重新显示新修改的数据。这一切工作正常。但是,一旦我修改了一个条目(在编辑页面中重新正确显示),当我返回列表时,该条目仍然具有旧值,编辑它仍然显示旧值。这在测试和开发环境中都会发生。

这是我的设置:

  • 通过 @OnApplicationStart 注解的 BootStrap 类从 data.yml 文件初始化数据
  • 测试环境配置:

    %test.db=fs

    %test.jpa.ddl=创建

  • 开发环境配置:

db=postgres://postgres:postgre@localhost:5432/play

  • 列表 Controller :

    列表 laundryLists = LaundryList.findAll();

-编辑 Controller

LaundryList updatedLaundryList = LaundryList.em().merge(laundryList);

我已经添加了日志输出,果然,在 EditController 中调用 merge 方法后,即使我添加了代码以从数据库中检索更新的实体,它也会返回一个正确更新的 bean值,例如我如何插入它们

然而,即使在这之后,在测试( Play 测试)或运行( Play 运行)环境中,一旦我为 ListCOntroller 重新键入(或单击链接),它仍然会显示(据称)修改过的条目及其具有的值在 EditController 中发生更新之前。如果我再次点击编辑它,该表单会向我显示该条目的初始未修改数据。

我的问题是,我应该怎么做才能将数据持久保存到数据库中?

最佳答案

我找到了解决方案,但这非常令人失望。

简而言之,我所做的就是替换这一行:

LaundryList.em().merge(laundryList);

用这个:

LaundryList updateLaundryList = LaundryList.em().merge(laundryList);
updateLaundryList.save();

长答案是:Play 改变了 JPA 的实际工作方式。在上面的例子中,我在一个事务中(日志清楚地显示了这一点,而且如果我尝试启动一个事务,则会引发异常,告诉我我实际上在一个已经运行的事务中)。然而,即便如此,执行 em().merge 实际上并没有对数据库执行任何插入/更新,如日志中所示。

是的,在他们的网站上的某个时候,他们确实说过“我们不喜欢 JPA 在您处理事务时自动同步数据的方式,因此您不需要调用持久化/合并,但您确实需要调用刷新,事实上您想要撤消您的更改,我们不喜欢这样,因此我们将其逆转:现在您必须明确保存,否则不会更新任何内容。”

他们还说(在这里我找到了实际引用):

“在连续请求期间,使用对象 ID 从数据库中检索对象,更新它并再次保存它。”

但仅此而已。没有代码示例什么都没有。由于他们改变了比 Play(即 JPA)更广为人知的框架的行为,他们应该更清楚地说明这一点,或者至少更改类名,制作包装器,说他们制作了自己的 PlayPersistenceManager 或其他东西.

不,我个人并不认为他们的方式更好。总的来说,与撤消某些更改相比,您更有可能坚持/更新某些内容,因此如果坚持/更新自动发生(没有样板代码)并且您需要明确地进行撤消会更好。

关于java - Play Framework : merge action only works in the Controller that triggered it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8142392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com