Как требует JPA, классы @Entity
должны иметь конструктор по умолчанию (не-arg) для создания экземпляров объектов при извлечении их из базы данных.
В Kotlin свойства очень удобны для объявления внутри основного конструктора, как в следующем примере:
class Person(val name: String, val age: Int) { /* ... */ }
Но когда конструктор non-arg объявлен как вторичный, ему требуются значения для первичного конструктора, поэтому для них необходимы некоторые допустимые значения, например:
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
В случае, если свойства имеют более сложный тип, чем просто String
и Int
, и они не могут быть обнуляемы, это выглядит совершенно плохим, чтобы предоставить значения для них, особенно когда в коде основного кода и init
и когда активно используются параметры - когда они должны быть переназначены с помощью отражения, большая часть кода будет выполнена снова.
Кроме того, val
-properties не может быть переназначен после выполнения конструктора, поэтому неизменность также теряется.
Итак, возникает вопрос: как можно адаптировать код Котлина для работы с JPA без дублирования кода, выбрав "магические" начальные значения и потерю неизменности?
P.S. Верно ли, что Hibernate в стороне от JPA может создавать объекты без конструктора по умолчанию?