Як вимагає JPA, @Entity
класи повинні мати конструктор за замовчуванням (не-аргумент) для екземпляру об'єктів під час отримання їх з бази даних.
У 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
властивості-властивості не можна перепризначити після виконання конструктора, тому незмінність також втрачається.
Тож виникає питання: як код Котліна можна адаптувати для роботи з JPA без дублювання коду, вибираючи "магічні" початкові значення та втрату незмінності?
PS Чи правда, що в сплячку в сторону JPA можна створювати об'єкти без конструктора за замовчуванням?
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)
- так, так, Hibernate може працювати без конструктора за замовчуванням.