【问题标题】:play framework 1.3.3 and hibernate cacheplay framework 1.3.3和hibernate缓存
【发布时间】:2017-01-23 16:52:48
【问题描述】:

项目正在使用播放框架 1.3.3 我有一个这样的控制器:

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 和 existingOldItem 非常相同。 Item.findById 行不会从数据库返回旧项目,而是从 http 请求返回新项目(与 JPA.em().createQuery 相同)。我想播放框架在缓存中发送一个新项目,并且 findById 从缓存中返回该项目,而不是从数据库中返回。拜托,谁能解释一下它背后的逻辑以及解决问题的方法。

【问题讨论】:

    标签: java hibernate caching playframework playframework-1.x


    【解决方案1】:

    问题是 item 和 existingOldItem 非常相同。 Item.findById 行不会从数据库中返回旧项目

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

    拜托,谁能解释一下它背后的逻辑...

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

    魔法就在JPAPlugin.bind。如您所料,它首先在数据库中查找对象。 如果找到该对象,则使用该对象调用Item.edit()。这也是魔法和 默认实现设置有匹配 HTTP 参数的 Item 的所有属性。

    ...以及解决问题的方法。

    我不确定您认为问题出在哪里,但如果您想要一个旧项目和一个新项目,那么客户不应该提供 item.id 参数。如果你不喜欢那个玩!挖掘您的数据库以实例化 item 参数,然后您可以提供自定义 binder 或让控制器操作接受外观相似的 POJO 类,而不是 JPA 类。

    【讨论】:

    • 谢谢!这是任何使用 JPA 的 Web 框架的正常行为,还是只是玩!东西?
    • 这是玩!具体的。如果其他 web 框架做同样的事情,那是巧合。如果有任何其他框架这样做,我会感到惊讶,因为 item.save() 是一个游戏!发明,而不是 JPA 实体通常的工作方式。如果其他一些框架在内存中修改了 JPA 对象,Hibernate 可能会将更改刷新到数据库中,而不会给应用程序逻辑拒绝它们的机会。但是在 Play! 中,应用程序逻辑必须调用 save() 才能刷新更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2015-08-17
    • 2014-11-28
    相关资源
    最近更新 更多