私は Hibernate を使い始めたばかりで、これまでに目にしたすべての例は、Hibernate のドキュメントのチュートリアルとほとんど同じように見えます。
package org.hibernate.tutorial.domain;
import java.util.Date;
public class Event {
private Long id;
private String title;
private Date date;
public Event() {}
/* Accessor methods... */
}
具体的には、どのフィールドも として宣言されfinal
ておらず、Hibernate フレームワークがクラスをインスタンス化してそのフィールドを設定できるように、引数のないコンストラクターが必要です。
しかし、ここに問題があります-私は、回避できるときはいつでもクラスを変更可能にするのが本当に好きではありません(Javaプラクティス: 不変オブジェクトは、これを行うことについてかなり強力な議論をします)。各フィールドを 'final' と宣言したとしても、Hibernate を機能させる方法はありますか?
Hibernate は Reflection を使用してそのクラスをインスタンス化するため、間違ったコンストラクターを選択したり、パラメーターの 1 つに間違った値を渡したりするリスクを負うことなく、ある種のコンストラクターを呼び出すことができる必要があることを理解しています。引数なしのコンストラクターを呼び出し、各フィールドを一度に 1 つずつ設定します。しかし、不変オブジェクトを安全にインスタンス化できるように、Hibernate に必要な情報を提供することは可能ではないでしょうか?
public class Event {
private final Long id;
private final String title;
private final Date date;
public Event(@SetsProperty("id") Long id,
@SetsProperty("title") String title,
@SetsProperty("date") Date date) {
this.id = id;
this.title = title;
this.date = new Date(date.getTime());
}
/* Accessor methods... */
}
もちろん、@SetsProperty
注釈は架空のものですが、手の届かないところにあるようには見えません。