【问题标题】:Updating the same table on the different applications using hibernate使用休眠更新不同应用程序上的同一个表
【发布时间】:2021-06-02 18:49:04
【问题描述】:

我有 2 个应用程序节点,它们都更新同一个数据库表。但是,更新的列是不同的。在这里出现问题,其次运行应用程序更新整行而不是单列。让我们深入研究问题解释。

表名为“student”,有 3 列。假设ID,column1,column2

行的初始状态是 ID=1, column1="abc", column2="xyz" 有问题的场景步骤如下

  • App-instance-1 :读取行并将其保持在持久状态。
  • App-instance-2 :读取行并将其保持在持久状态。
  • App-instance-1 :将 pojo 属性 column1 更新为“ABC”(column1="ABC", column2="xyz")。
  • App-instance-2 :将 pojo 属性 column2 更新为“XYZ”(column1="abc",column2="XYZ")。
  • App-instance-1 :将 pojo 合并到 db 表中,行看起来像 ID=1,column1="ABC",column2="xyz"
  • App-instance-2 :将 pojo 合并到 db 表中,行看起来像 ID=1,column1="abc",column2="XYZ"

最后,应用实例会覆盖彼此的列。 我希望看到最后一行是 column1="ABC", column2="XYZ"。但是,它是 column1="abc", column2="XYZ"

我的问题是,为什么 App-instance-1 会更新 column2,即使 column2 没有更改。 column2 在 instance-1 上不脏。我该如何克服这个问题?

@Entity
@Table("student")
public class Student {
    private Long ID;
    private String column1;
    private String column2;
    
    // Assuming other definations are ok.
}

提前致谢。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    据我所知,您可以尝试以下两种方法之一:

    • 使用乐观锁定(例如,Hibernate 提供的@Version
    • 创建自定义查询以仅更新一个字段而不是更新整个实体。

    【讨论】:

    • 我会看看@Version。对于自定义查询,当应用尝试同时更新 column1 和 column2 时会发生什么情况。无法理解哪一列对我来说是脏的。 Hibernate 应该处理这个问题。当我只更改 column1 时,生成的 sql 应该类似于 update student set column1=? ID =? .因为我只是触摸 column1。
    • 这不是可以解决您的问题吗? stackoverflow.com/questions/2674516/…
    • 完全相同的问题:) 我希望动态更新能解决我的问题。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2014-10-22
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2015-10-17
    • 2011-10-06
    相关资源
    最近更新 更多