【发布时间】:2015-11-09 08:51:51
【问题描述】:
根据 JPA 的要求,@Entity 类应该有一个默认(非 arg)构造函数,以便在从数据库中检索对象时实例化它们。
在 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-properties 在构造函数执行后无法重新赋值,因此也就失去了不变性。
所以问题是:如何在不重复代码、选择“神奇”初始值和丧失不变性的情况下使 Kotlin 代码适应 JPA?
附:除了 JPA 之外,Hibernate 真的可以构造没有默认构造函数的对象吗?
【问题讨论】:
-
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)- 所以,是的,Hibernate 可以在没有默认构造函数的情况下工作。 -
使用 setter 的方式 - 又名:可变性。它实例化默认构造函数,然后查找设置器。我想要不可变的对象。唯一可以做到的方法是hibernates开始查看构造函数。这个hibernate.atlassian.net/browse/HHH-9440有一张公开的票
标签: hibernate jpa default-constructor kotlin