Как требуется JPA, классы @Entity
должны иметь конструктор по умолчанию (без аргумента) для создания экземпляров объектов при их извлечения из базы данных.Kotlin с JPA: конструктор по умолчанию
В Котлин, свойства очень удобно, чтобы объявить внутри первичного конструктора, как показано в следующем примере:
class Person(val name: String, val age: Int) { /* ... */ }
Но когда не-Arg конструктор объявлен как вторичный один он требует значения для первичной конструктор будет принят, поэтому некоторые действительные значения необходимы для них, как здесь:
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
в случае, когда свойства имеют некоторые более сложный тип, чем просто String
и Int
и они ненулевые, то вот oks совершенно плохо для того, чтобы предоставить значения для них, особенно когда в основном конструкторе и блоке init
есть много кода, и когда параметры активно используются - когда они должны быть переназначены с помощью отражения, большая часть кода будет выполнена снова.
Кроме того, val
-properties не может быть переназначен после выполнения конструктора, поэтому неизменность также теряется.
Итак, вопрос в том, как можно адаптировать код Котлина для работы с JPA без дублирования кода, выбрав «магические» начальные значения и потерю неизменности?
P.S. Верно ли, что Hibernate в стороне от JPA может создавать объекты без конструктора по умолчанию?
'INFO - org.hibernate.tuple.PojoInstantiator: HHH000182: конструктор по умолчанию (без аргументов) для класса: Test (класс должен быть создан Interceptor)' - так, да, Hibernate может работать без конструктора по умолчанию , –
То, как это делается, с сеттерами - aka: Mutability. Он создает экземпляр конструктора по умолчанию, а затем ищет сеттеры. Я хочу неизменные объекты. Единственный способ, который можно сделать, - это спящий режим, начинающийся с поиска конструктора. Существует открытый билет на этом https://hibernate.atlassian.net/browse/HHH-9440 –