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
、null可能ではない場合、特にプライマリコンストラクターとinit
ブロックに多くのコードがあり、パラメーターがアクティブに使用されている場合、それらの値を提供することは完全に悪いように見えます- -それらがリフレクションによって再割り当てされる場合、ほとんどのコードが再度実行されます。
さらに、val
コンストラクターの実行後に-propertiesを再割り当てできないため、不変性も失われます。
したがって、問題は、コードを重複させずに「マジック」初期値と不変性の損失を選択して、JPAで動作するようにKotlinコードをどのように適合させることができるかということです。
PS JPA以外のHibernateがデフォルトのコンストラクターなしでオブジェクトを構築できるのは本当ですか?
INFO -- org.hibernate.tuple.PojoInstantiator: HHH000182: No default (no-argument) constructor for class: Test (class must be instantiated by Interceptor)
–はい、そうです。Hibernateはデフォルトのコンストラクターがなくても機能します。