【问题标题】:JSONB column not updated to NULL valueJSONB 列未更新为 NULL 值
【发布时间】:2020-06-10 11:15:21
【问题描述】:

我有一个经典的多层 REST Spring Boot 应用程序,连接到 PostgreSQL 数据库。 在此应用程序中,端点之一应该在我的一个实体上将某些字段设置为 NULL。

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class Assessment extends AbstractEntity {
    ...

    @ManyToOne
    @JoinColumn(name = "disputer_id")
    private User disputer;

    @Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    @Basic(fetch = FetchType.LAZY)
    private Form dispute;
    ...
    private String disputeFeedback;
    ...
}

由于某些原因,在某些情况下,争议字段(JSONB 类型,使用 com.vladmihalcea.hibernate.type.json.JsonBinaryType)未设置为 NULL。

我尝试了以下设置组合:

1. 
- application: Spring Boot on my local machine
- database: setup using Docker on my local machine
- result: all 3 fields from above set to NULL
2. 
- application: on my local machine
- database: PostgreSQL in a Kubernetes container (test environment)
- result: all 3 fields from above set to NULL
3. 
- application: Spring Boot in a Kubernetes container (test environment)
- database: PostgreSQL in a Kubernetes container (test environment)
- result: all fields except the JSONB field set to NULL.

我启用了 SQL 日志,但我注意到由于某种原因,对于第三个设置,更新脚本中根本不包含 jsonb 列:

Hibernate: 
    update
        assessment 
    set
        ...
        dispute_feedback=?,
        disputer_id=?,
        ...
        time_of_last_status_change=?
    where
        id=?
...
2020-02-26 12:48:59.553 TRACE 1 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [4] as [VARCHAR] - [null]
2020-02-26 12:48:59.553 TRACE 1 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [5] as [OTHER] - [null]
...
2020-02-26 12:48:59.554 TRACE 1 --- [nio-8090-exec-1] o.h.type.descriptor.sql.BasicBinder      : binding parameter [14] as [TIMESTAMP] - [2020-02-26T12:48:59.500787Z]

结合 Hibernate 的 JSONB 列在更新它们时是否有一些限制?虽然我之前和他们合作过,没有遇到过这样的问题。

谢谢


更新 1: 我尝试将 @DynamicUpdate 注释添加到我的实体中,现在该列在测试环境中也设置为 NULL,但这仍然让我想知道为什么此列未包含在更新脚本的第一个版本中。

【问题讨论】:

    标签: spring hibernate sql-update jsonb hibernate-types


    【解决方案1】:

    它看起来像 Hibernate 中的一个错误。

    我注意到您在 JSON 实体属性上启用了延迟加载:

    @Basic(fetch = FetchType.LAZY)
    

    如果您也启用了字节码增强功能,请尝试删除 @Basic(fetch = FetchType.LAZY) 注释并查看问题是否仍然存在。

    这可能是 Hibernate ORM 中的字节码增强问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多