これはあなたには愚かに聞こえるかもしれませんが、なぜ@Entity
sに空のコンストラクターを定義する必要があるのですか?
私が見たすべてのチュートリアルは言った:すべてのエンティティは空のコンストラクタを必要とします。
ただし、Javaは、デフォルトの非表示の空のコンストラクターを常に提供します(再定義しない場合)。
ありがとう。
セマンティックの問題があると思います。 「必要」で私が理解したのは、書くことでした。
意味:エンティティには常に空のコンストラクターを記述します。
例:
@Entity
public class MyEntity implements Serializable {
@Id
private String str;
public MyEntity(){}
//here getter and setter
}
ただし、Javaは、再定義しない場合(パラメーターを使用して別のコンストラクターを作成する場合)、常にこの空のコンストラクターを提供します。
この場合、この空のコンストラクターを作成しても役に立たないようです。
永続フレームワークによるリフレクションを介して新しいインスタンスを作成するには、空のコンストラクターが必要です。クラスの引数を持つ追加のコンストラクターを提供しない場合、デフォルトごとに1つを取得するため、空のコンストラクターを提供する必要はありません。
次のような@PersistenceConstructorアノテーションを使用することもできます
@PersistenceConstructor
public Movie(Long id) {
this.id = id;
}
spring Dataがプロジェクトに存在する場合にエンティティを初期化する。したがって、空のコンストラクタも回避できます。
ただし、Javaは、デフォルトの非表示の空のコンストラクターを常に提供します(再定義しない場合)。
このステートメントは、クラスにコンストラクターを提供しない場合にのみ当てはまります。クラスに引数コンストラクターが提供されている場合、jvmは引数なしのコンストラクターを追加しません。
エンティティに別のコンストラクタを提供しない限り、デフォルトのコンストラクタを明示的に定義する必要はありません。デフォルトのコンストラクタのシグネチャを持つコンストラクタを別にして、別のコンストラクタを提供する場合、デフォルトのコンストラクタは作成されません。
JPA実装はデフォルトのコンストラクターの存在に依存しているため、省略されるデフォルトのコンストラクターを含める必要があります。
「JPA」タグを指定したので、質問はJPAのみに適用され、空のコンストラクター一般には適用されないと想定します。
Persitenceフレームワークは多くの場合、リフレクション、より具体的にはClass<T>.newInstance()
を使用してオブジェクトをインスタンス化し、イントロスペクションによってgetter/setterを呼び出してフィールドを設定します。
そのため、空のコンストラクターとゲッター/セッターが必要です。
Hibernateの空のコンストラクターに関する StackOverflowの質問を参照してください。
実際に書く必要はありません。デフォルトであります。ユーザーがデフォルトを使用できないように、private
コンストラクターを作成できる場合があります
public class MyClass{
private MyClass(){}
}
たとえば、シングルトンパターンの場合、既定のコンストラクターを使用してブロックできます。
時々、Gson
プラグインを使用してString JsonデータをObjectに変換するとき、デフォルトのコンストラクターを記述する必要があります。そうしないと機能しません
クラスが引数コンストラクターを取得した場合、Javaは常にデフォルトの目に見えない空のコンストラクターを提供するわけではありません。自分で空のコンストラクターを定義する必要があります。