根据JPA的要求,@Entity
类应该有一个默认(无参)构造函数,用于在从数据库检索对象时实例化它们。
Kotlin中,属性可以很方便地在主构造函数中声明,如下面的示例:
class Person(val name: String, val age: Int) { /* ... */ }
然而,当无参构造函数被声明为辅助构造函数时,它需要传递主构造函数的值,因此需要为其提供一些有效的值,例如:
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
如果属性的类型比仅为String
和Int
更复杂,并且它们是非可空类型,那么为它们提供值看起来会非常糟糕,特别是当主构造函数和init
块中有大量代码并且这些参数被积极使用时--当它们通过反射重新分配时,大部分代码将再次执行。
此外,val
属性在构造函数执行后无法重新赋值,因此不可变性也会丢失。
那么问题是:如何适应Kotlin代码以与JPA一起使用,而不会出现代码重复、选择“神奇”的初始值和不可变性丢失的情况?
P.S.除了JPA之外,Hibernate是否可以构造没有默认构造函数的对象?