Если я загружаю экземпляры из следующих классов с помощью JPA / Hibernate и получаю доступ к свойству x
, значение будет 0
.Если я установлю точку останова для свойства, оно никогда не будет достигнуто.Похоже, что реализация здесь полностью игнорируется.
Сокращенный до соответствующих частей код выглядит следующим образом:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
abstract class Base {
@Transient
open val x = 1
}
@Entity
@DiscriminatorValue("D")
class Derived : Base() {
@Transient
override val x = 2
}
Однако, если я реализую метод получения явно, он работает:
override val x get() = 2
Насколько я знаю, компилятор Kotlin в этом случае не генерирует вспомогательное поле, но он должен генерировать метод получения, так как это свойство не private
.В конце должен быть метод в обоих случаях.
Так в чем же разница, которая приводит к странному поведению, что x
равно 0
и к реальному свойству никогда не обращаются?