gpt4 book ai didi

java - play框架1.3.3和hibernate缓存

转载 作者:行者123 更新时间:2023-12-01 21:08:25 25 4
gpt4 key购买 nike

项目正在使用play框架1.3.3我有一个这样的 Controller :

public static void save(Item item) {
if (item.id != null) { //It means that item is not new, it is being edited
Item existingOldItem = Item.findById(item.id);
//Here I should have an old version of an item as "existingOldItem"
//and new one coming from http request as "item"
}

但问题是 item 和现有的 OldItem 非常相同。 Item.findById 行不会从数据库返回旧项目,而是从 http 请求返回新项目(与 JPA.em().createQuery 相同)。我想 play 框架会在缓存中发送一个新项目,而 findById 从缓存而不是从数据库返回该项目。请有人向我解释一下其背后的逻辑以及解决问题的方法。

最佳答案

the problem is item and existingOldItem are very identical. Item.findById line doesn't return me an old item from database

这是预期的行为。 Item.findById() 返回由 HTTP 客户端修改的旧项目。看看JPA object binding来自戏剧!文档以查看调用模式。

Please, could someone explain me the logic behind it...

简而言之,HTTP 客户端需要在 HTTP 请求中提供项目记录的 ID 及其新属性值。玩!设置项目参数准备保存,在数据库中查找该项目并根据POST参数修改其属性。所以你不应该有一个“旧”和一个"new"项目,你应该只有一个“item”对象可能是旧的或新的,具体取决于是否找到 HTTP 客户端提供的 ID在数据库中。您的 Controller 操作所要做的就是调用 item.save()

神奇之处在于JPAPlugin.bind。正如您所猜测的,它首先在数据库中查找对象。如果找到该对象,则会使用该对象调用 Item.edit()。这也是魔法默认实现设置具有匹配 HTTP 参数的 Item 的所有属性。

... and the ways how to solve the problem.

我不确定您认为问题是什么,但如果您想要一个旧的和一个新的项目,那么客户不应该提供item.id 参数。如果你不喜欢这个游戏!深入您的数据库以实例化 item 参数,然后您可以提供自定义绑定(bind)器或让 Controller 操作接受类似的 POJO 类,而不是 JPA 类。

关于java - play框架1.3.3和hibernate缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41811513/

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