Значения Null для встроенных объектов не принимаются

#postgresql #kotlin #spring-data #spring-data-jdbc

#postgresql #котлин #spring-данные #spring-data-jdbc #kotlin

Вопрос:

Я пытаюсь сохранить объект, содержащий встроенный объект, используя Spring Data JDBC. И он не сохраняется, потому что он не проходит нулевую проверку.

Я создал внешний класс для сохранения.

 data class Outer(
    @Id 
    val id: Long,

    val value: String,

    @Embedded 
    inner: Inner? = null
)
  
 data class Inner(
    val innerValue1: String,
    val innerValue2: String
)
  

В БД я хотел бы иметь только одну таблицу , для Outer которой содержатся поля id , value , inner_value_1 и inner_value_2 . Вот почему я поместил @Embedded аннотацию в поле inner -.

id и value должны быть обязательные поля. innver_value_1 и invver_value_2 может быть нулевым,

Проблема возникает, когда я пытаюсь сохранить null-внутренний объект (который обнуляется как в Kotlin, так и в DB).

 val outer = Outer(15, "value")

repo.save(outer) //throws an exception
  

Операция сохранения в репозиторий вызывает исключение, потому что ожидается, что значение inner не будет равно null:

 Caused by: java.lang.IllegalArgumentException: Target bean must not be null!
    at org.springframework.util.Assert.notNull(Assert.java:198)
    at org.springframework.data.mapping.model.BasicPersistentEntity.verifyBeanType(BasicPersistentEntity.java:550)
    at org.springframework.data.mapping.model.BasicPersistentEntity.getPropertyAccessor(BasicPersistentEntity.java:453)
  

Трудность заключается в том, что в Kotlin я не могу передать объект с полями с нулевым значением (потому что они не обнуляются).

Есть ли какой-нибудь способ сохранить пустой / нулевой встроенный объект?

Комментарии:

1. Похоже, это ошибка. Пожалуйста, создайте проблему на jira.spring.io/browse/DATAJDBC

2. Похоже, это уже произошло: jira.spring.io/browse/DATAJDBC-364

3. спасибо, @JensSchauder. Это мой билет.

Ответ №1:

Эта проблема задокументирована в DATAJDBC-364 и исправлена для этапа 1.1 M4. Пожалуйста, обратите внимание, что это связано с DATAJDBC-374, который позволяет настраивать способ загрузки этих встроенных объектов.