根据JPA的要求,@Entity
类应具有默认的(非arg)构造函数,以在从数据库中检索对象时实例化这些对象。
在Kotlin中,可以很方便地在主构造函数中声明属性,如以下示例所示:
class Person(val name: String, val age: Int) { /* ... */ }
但是,当将非arg构造函数声明为辅助构造函数时,它要求传递主要构造函数的值,因此需要一些有效值,例如:
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
在情况下,当性能有一些更复杂的类型不只是String
和Int
他们是不可为空的,它看起来完全坏为他们提供价值,尤其是当有在主构造和太多的代码init
块,当正在积极使用的参数- -当通过反射重新分配它们时,大多数代码将再次执行。
此外,val
在构造函数执行后无法重新分配-properties,因此也失去了不变性。
所以问题是:如何在不进行代码重复,选择“魔术”初始值和丧失不变性的情况下使Kotlin代码适用于JPA?
PS是真的,除了JPA之外,Hibernate可以使用默认构造函数构造对象吗?
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)
–是的,Hibernate可以在没有默认构造函数的情况下工作。