У меня есть классовое c многослойное приложение 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]
Имеют ли столбцы JSONB в сочетании с Hibernate какие-то ограничения, когда речь заходит об их обновлении? Хотя ранее я работал с ними и не сталкивался с такими проблемами.
Спасибо
Обновление 1: Я попытался добавить аннотацию @DynamicUpdate в моя сущность и теперь столбец также имеют значение NULL в тестовой среде, но это все еще заставляет меня задуматься, почему этот столбец не был включен в первую версию сценария обновления.