【发布时间】: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