[解決済み] KotlinとJPA:デフォルトのコンストラクタ地獄
質問
JPAが要求するように。
@Entity
クラスは、データベースからオブジェクトを取得する際にインスタンス化するためのデフォルトの (引数以外の) コンストラクタを持つ必要があります。
Kotlinでは、以下の例のように、一次コンストラクタ内でプロパティを宣言すると非常に便利です。
class Person(val name: String, val age: Int) { /* ... */ }
しかし、arg 以外のコンストラクタを 2 次コンストラクタとして宣言すると、1 次コンストラクタの値を渡す必要があるため、ここのようにいくつかの有効な値が必要になるのです。
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
プロパティが、単に
String
と
Int
特に、プライマリコンストラクタや
init
ブロックがあり、パラメータが積極的に使われるとき、つまりリフレクションによってパラメータが再割り当てされるとき、コードのほとんどが再び実行されることになるのです。
さらに
val
-プロパティはコンストラクタの実行後に再割り当てできないので、不変性も失われます。
つまり、KotlinのコードをJPAに適用する場合、コードの重複や初期値の選択、不変性の喪失を回避するにはどうすればよいでしょうか。
追伸:JPAの脇のHibernateは、デフォルトコンストラクタを持たないオブジェクトを構築できるというのは本当でしょうか?
どのように解決するのですか?
Kotlin 1.0.6時点
は、その
kotlin-noarg
コンパイラプラグインは、選択されたアノテーションでアノテーションされたクラスに対して合成デフォルトコンストラクタを生成します。
gradleを使用している場合は
kotlin-jpa
でアノテーションされたクラスのデフォルトコンストラクタを生成するには、プラグインだけで十分です。
@Entity
:
buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
}
}
apply plugin: "kotlin-jpa"
Mavenの場合。
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<configuration>
<compilerPlugins>
<plugin>jpa</plugin>
</compilerPlugins>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-noarg</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>
関連
-
org.xml.sax.SAXParseException: ルート要素に先行する文書内のマークアップは,十分にfoでなければならない。
-
Hibernateのhqlです。INSERT INTO ...のみ SELECT ... 形式のみがサポートされます。
-
引数型[java.lang.String]の名前がない、またパラメータ名情報が
-
原因:java.lang.ClassNotFoundException: com.mchange.v2.c3p0.ComboPooledDataSource
-
[解決済み] JPA EntityManager。なぜmerge()ではなくpersist()を使うのか?
-
[解決済み] Kotlin 三項条件演算子
-
[解決済み] by lazy" と "lateinit" を使ったプロパティの初期化
-
フィールド 'ID'にデフォルト値がない
-
[解決済み】KotlinでJavaの静的メソッドに相当するものは何ですか?
-
[解決済み】JPA JoinColumnとmappedByの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
同じ識別子値を持つ別のオブジェクトがすでにセッションと関連付けられていました。
-
org.xml.sax.SAXParseException: ルート要素に先行する文書内のマークアップは,十分にfoでなければならない。
-
同じ識別子値を持つ別のオブジェクトがすでにセッションに関連付けられている場合。
-
LazyInitializationException: ロールのコレクションを遅延して初期化できませんでした。
-
カラム処理方式でデータを切り捨て
-
[解決済み] DAOパターンとRepositoryパターンの違いは何ですか?
-
フィールド 'ID'にデフォルト値がない
-
hibernateExceptionFound コレクションへの共有リファレンス
-
hibernate exception "Found shared references to the collection" (コレクションへの共有参照が見つかりました。
-
[解決済み] 多対多のアソシエーションテーブルを追加カラムでマッピングする