java - play框架1.3.3和hibernate缓存

标签 java hibernate caching playframework playframework-1.x

项目正在使用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/

相关文章:

java - 你能帮我打印一个用二叉搜索树制作的家谱吗?

java - GWT 中禁用元素(按钮)的工具提示

caching - 清除页面缓存后的 "Page is being generated."消息 TYPO3 7.6

java - 将字符串值散列到区间 [0; 1]

java - Log4j 显示不正确的日志记录级别

java - Logback 不适用于 Hibernate

java - 程序关闭后事务是否结束?

java - 如果未在字符串的 @Column 注释上指定长度属性,会发生什么情况

tomcat - 使用 hazelcast 缓存部署 tomcat servlet

session - 在 Laravel 中使用 Redis 持久化闪存数据