Свойство объекта Hibernate равно нулю, если оно не инициализировано с помощью Hibernate.unproxy - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть объект-сущность с type значение null (оно не равно нулю в дБ). Когда я вызываю Hibernate.unproxy на объекте сущности - и смотрю на объект с повышенным содержанием type - он не равен нулю. Эта сущность унаследована от другой сущности (я упоминаю об этом, потому что я не видел такого поведения с не унаследованными сущностями).

Вот код сущностей сущностей:

open class HealthValue {

    @get:Id
    open var id: UUID? = null   
    @get:ManyToOne(fetch = FetchType.LAZY)
    open var healthValueType: HealthValueType? = null

}

class ObservedHealthValue : HealthValue() {

}

open class HealthValueType {

    @get:Id
    open var id: UUID? = null
    @get:Enumerated(EnumType.STRING)
    @get:Column(nullable = false)
    var type: ObservationType? = null

}

class SelectionValueType : HealthValueType() {

}

Вот фрагмент сДемонстрация ошибки:

@Transactional
fun method(id: UUID) {
  val healthValue= entityManager.find(ObservedHealthValue::class.java, id)
  val type1 = healthValue.healthValueType!!.type // this value is null
  val type2 = Hibernate.unproxy(healthValue.healthValueType!!).type // this is not null
}

Это поведение выглядит странно, не уверен, что использование Hibernate.unproxy является правильным подходом. Есть ли у вас какие-либо идеи, почему это происходит, как это можно исправить?

Моя версия гибернации: 5.3.7.Final (это происходит из зависимости от gradle compile("org.springframework.boot:spring-boot-starter-data-jpa") с включенным плагином 'org.springframework.boot' version '2.2.0.RELEASE')

1 Ответ

0 голосов
/ 06 ноября 2019

Я нашел резонанс - это потому что type поле не было open. В kotlin все поля по умолчанию final, поэтому вам нужно указать их как open. Вот так это работает:

open class HealthValueType {
    @get:Id
    open var id: UUID? = null
    @get:Enumerated(EnumType.STRING)
    @get:Column(nullable = false)
    open var type: ObservationType? = null
}

Но, лучшее решение - использовать плагин kotlin-allopen .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...