按照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有更复杂的types,并且它们是不可空的,那么为它们提供值看起来完全不好,特别是当主构造函数和init块中有很多代码,并且参数是积极使用 – 当它们被重新分配时,大部分代码将被重新执行。 而且, val -properties不能在构造函数执行后重新分配,所以不可变性也会丢失。 所以问题是:Kotlin代码如何适应与JPA无代码重复,选择“魔术”的初始值和不可变性的损失? PS除了JPA,Hibernate是否可以构造没有默认构造函数的对象呢?
有没有实现JPA的ORM框架,但不需要@Entity类的默认(无参数)构造函数? AFAIK,在JPA文档中说,一个@Entity应该有默认的构造函数,但是一个实现是否支持构造函数参数注入(或者可能是不安全的对象实例化),因此使用没有默认构造函数的类? 这个特性对于确保不变性( 标准的 JPA缺少)有很大的帮助,并且可以让开发人员对类实例状态保持严格的不variables(例如,它的字段总是有正确的值)。 顺便说一下,当使用Kotlin时,无参构造函数的需要会干扰良好的代码风格和编码约定。 有JIRM库处理构造函数注入和不可变性,但它不是一个完整的JPA实现。 那么,是否有任何JPA ORM支持@Entity类没有默认的构造函数?