根据 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
-属性不能被重新分配,因此不可变性也会丢失。
因此,问题是: Kotlin 代码如何适应 JPA 而不需要代码复制、选择“魔术”初始值和不可变性的损失?
另外,除了 JPA,Hibernate 真的可以构造没有缺省构造函数的对象吗?