【问题标题】:Ignore null values of entity bean while updating the table using Hibernate使用 Hibernate 更新表时忽略实体 bean 的空值
【发布时间】:2014-06-10 17:16:00
【问题描述】:

Stuck on the same problem在更新Hibernate中的数据库时有什么方法可以忽略null的值吗?

每当你调用 update();的Session,它也会更新在对象中找到的空值。

例子:

User user = new User();
user.setUserId(5);
user.setUserName("Maarten");
user.setUserFirstName(null); // but in database this value is not null

session.update( user);

session.saveOrUpdate( user);

数据库现在将更新用户,但会将用户名设置为 null(因为它在对象中为 null)。

在 Hibernate 中是否有任何方法或方法可以避免这种情况(我不想触发选择/更新查询来设置 bean)?它会忽略空值吗?

【问题讨论】:

标签: java hibernate


【解决方案1】:

hibernate-dynamic-update

dynamic-update 属性告诉 Hibernate 是否在 SQL UPDATE 语句中包含未修改的属性。

【讨论】:

【解决方案2】:

其中一个选项是,load bean 使用会话中的 get(object) 方法,然后设置/更改值。但这会带来对数据库的一次额外调用的开销。 或者,如果拨打额外电话至关重要,您也可以创建自定义查询。

编辑:如果bean 被缓存,那么get(object) 将不会影响性能。

【讨论】:

    【解决方案3】:

    这取决于你希望控制的抽象级别,以及对象的业务规则:

    • 字段 真的 可以为空,还是您只是将其用作 DTO?也许您需要一个中间对象来控制空值
    • 新用户会发生什么(如示例中所示)?我应该忽略空值,那么应该保留哪个值,默认值?

    无论如何,如果您在较低级别定义您的要求,例如“不要在更新查询中包含空值”,您可以使用以下内容:

    • sql-update 注解here。您可以使用自定义 sql 查询或过程来控制值
    • dynamicUpdate 是关于变化,而不是价值,所以我认为它不是很合适
    • 如果需要,请使用 EntityListener 和辅助瞬态字段来恢复更改。
    • 其他选项:使用interceptor 甚至创建custom dialect

    【讨论】:

      最近更新 更多