【问题标题】:Update only non null fields of an object in hibernate在休眠中仅更新对象的非空字段
【发布时间】:2013-10-26 09:54:04
【问题描述】:

我有一个用例,其中我只有少数更新的持久对象字段,其中包括表的主键。在这种情况下,我只想用这些字段更新行。我发现hibernate没有为此提供任何开箱即用的解决方案,所以我自己编写了一个方法,它使用反射来确定对象的所有非空字段并基于此创建更新查询并最终执行它。我的应用程序是使用 spring 框架编写的。到目前为止,我的做法是,我有一个单独的 util 类,它有一个更新方法,它接受会话对象、主键、主键值和表名。这是实现这个用例的好方法吗?有什么更好的建议吗?

【问题讨论】:

    标签: java mysql spring hibernate


    【解决方案1】:

    你的问题我不清楚。对于更新,您可以进行选择然后保存。或者只是创建该实体并保存它(这里必须使用主键)。既然要更新,可以使用第一种方法。无需担心这里的必填字段。

    【讨论】:

    • 您的解决方案将导致执行 2 个查询:首先选择然后更新。我想在一个查询本身中进行更新。这就是我这样做的原因。
    • 您可以将所有非空值传递给构造函数。所以只有在所有非空字段都有值的情况下才能创建持久化对象。
    • 假设我有一个用户类,其中有名字、姓氏和中间名,id 作为字段。如果我只想更新名字,我会创建只有名字和 id 的用户对象。现在,如果我执行 session.saveorupdate(user) 那么数据库中的 lastname 和 middlename 将被设置为 null。这不是我想要的。我想只更新数据库中的名字,留下姓氏和中间名。
    • 为此,您可以使用 HQL 或 Hibernate Criteria。如果名字、姓氏或中间名中的任何一个有值,那么它将被更新
    • 你能解释一下我上面给出的例子吗?如何使用休眠标准来实现这一目标?
    【解决方案2】:

    大多数时候,导致将默认值保存在要持久化的实体的可为空字段中的原因之一是,因为在实体的 POJO 中使用了原始数据类型。
    请检查您是否没有使用任何原语。如果是,则切换到相应的包装类,然后保存。它应该在保存或更新后在提交时将 null 传递给数据库。
    希望这能解决你的问题:)

    【讨论】:

      猜你喜欢
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      相关资源
      最近更新 更多