gpt4 book ai didi

jpa - 数据库更新前的计算

转载 作者:行者123 更新时间:2023-12-04 06:14:19 25 4
gpt4 key购买 nike

我正在使用 Play Framework,我认为这是一个非常常见的持久性问题:

  • 我显示一个表格,其中包含来自数据库的值和一个字段“数量”
  • 用户更新表单并更改“数量”值
  • 他点击“保存按钮”
  • 在调用的 Controller 方法中,我想在更新数据库
  • 之前获取“数量”的旧值并计算新旧值之间的差异。
  • 为此,我使用 findById(在调用 object.save 方法之前),但它给了我新值,而不是旧值:它显然查看了一些缓存(哪个?)而不是请求 DB

  • => 这是正常的吗?我怎样才能得到旧值,进行计算然后坚持?

    非常感谢您的帮助,我不想在我的数据库中管理旧/新值...我敢肯定这是不好的做法!

    更新
        public static void save(@Valid Lot lot) {
    History element = new History();
    element.date = new Date();
    //HERE below it returns the new value, not the old one
    Lot databaseLot = Lot.findById(lot.id);
    element.delta= databaseLot.quantity - lot.quantity;
    element.save();
    lot.save();
    list(null, null, null, null);
    }

    最佳答案

    这是因为,Play 在这里为你做了一些魔术。

    当您将一个包含 ID 的 JPA 对象传递给您的 Controller 时,Play 将自动从数据库中检索此 JPA 对象。如果您 look here ,它更详细地解释了这一点。它声明(并假设在用户 JPA Pojo 中传递的操作调用)

    You can automatically bind a JPA object using the HTTP to Java binding.

    You can provide the user.id field yourself in the HTTP parameters. When Play finds the id field, it loads the matching instance from the database before editing it. The other parameters provided by the HTTP request are then applied. So you can save it directly.



    那么,你怎么能解决这个问题呢?我想最简单的方法是不将 id 作为 Pojo 对象的一部分传递,并将 ID 作为单独的参数传递,因此 Play 会认为不需要从数据库中自动检索该对象。

    另一种方法是为数量字段设置一个 setter 方法,该方法会更新 delta。因此,Play 将自动从数据库中检索对象,然后调用您的 setter 方法来更新值(根据正常的 POJO 绑定(bind)),并且作为该操作的一部分,您的新数量和增量被设置。完美的!在我看来,这是最好的选择,因为它还可以确保业务逻辑整齐地保留在您的模型中,而不是您的 Controller 中。

    关于jpa - 数据库更新前的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7447602/

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