[解決済み] Entity上で@AllArgsConstructorと@NoArgsConstructorを併用する理由とは?
質問
ネット上でIntelliJでのSpring Bootの応用について複数のコードを見ましたが、多くの場合は
@AllArgsConstructor
と
@NoArgsConstructor
というように、どちらもコンストラクタですが、その目的は異なります。
-
@AllArgsConstructor
アノテーションされたクラスのすべてのフィールドの引数を必要とするコンストラクタを生成します。 -
@NoArgsConstructor
はパラメータを持たないコンストラクタを生成します。
では、なぜ同じエンティティに対して両者を併用するのか、またその場合、両者はどのように機能するのでしょうか。
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
public class Product {
@Id
private int id;
private String name;
private String type;
}
解決方法は?
その
JPA仕様
は、すべての永続的なクラス (
@Entity
) は、public か protected かを問わず、引数のないコンストラクタを持ちます。(Hibernateのような実装を扱う場合、これは必ずしも正しいとは限らないことに注意してください。
本解
).
これは、JPAがReflection APIを使用してビーンクラスを作成するために、デフォルトのコンストラクタメソッドを使用するために必要です。実際、クラスが多くのコンストラクタを含む場合、JPAはどれを呼び出すべきかわからなくなります。
Product.class.newInstance();
と同等である。
new Product()
(
Product.class
は
クラスリテラル
インスタンス化されると、フィールドセッターを使用してそのクラスを処理します。
そして、Javaでは、他のコンストラクタを定義しない限り(他のコンストラクタを用意しない場合のみ)、クラスに対してデフォルトのコンストラクタ(無引数型コンストラクタ)が自動的に生成されます。
つまり、他にコンストラクタが定義されていない場合、コンパイラは自動的にデフォルトの無引数コンストラクタを作成するので、フレームワーク(ここではJPA)が要求する場合は、コンストラクタを定義するクラスだけが無引数コンストラクタも含めなければならないのです。このため
@NoArgsConstructor
アノテーションを追加した場合
@AllArgsConstructor
アノテーションを使用します。
を使用している点にも注意してください。
@Data
の機能を束ねたものです。
@RequiredArgsConstructor
のコンストラクタを生成し、すべての
final
または
@NonNull
注釈付きフィールド(Lombok参照
ドキュメンテーション
). そのため、null 値が確定しないフィールドのみを使用している場合、たとえそのフィールドに
@NoArgsConstructor
アノテーションを使用します。私はこのケースをテストしたわけではありませんが
@RequiredArgsConstructor
を使用した場合に同じように動作するかどうかはわかりません。
@Data
.
@Data
もバンドルされます。
@ToString
を追加する必要はありません。
私は、個人的に
@Data
のようなアノテーションが必要でない場合、私は通常、単に.NET Frameworkを使用します。
@Entity
@Getter
@Setter
@EqualsAndHashCode
public class Product {
@Id
private int id;
private String name;
private String type;
}
を使用しないことが多いので
toString()
また、パラメータ化されたコンストラクタを使用することもできます。より冗長かもしれませんが、私にとってはより意味のあることです。
関連
-
[解決済み】Bad Request - このホストとポートの組み合わせはTLSが必要です。
-
[解決済み] クラスパスに @ConfigurationProperties Spring Boot Configuration Annotation Processor が見つかりません。
-
[解決済み] テンプレート "index "の解決に失敗しました。テンプレートが存在しないか、設定されたテンプレートリゾルバでアクセスできない可能性があります。
-
[解決済み] このリソースにアクセスするには、生成されたアクセストークンを使用して完全な認証を行う必要があります。
-
[解決済み] Bad Request - このホストとポートの組み合わせはTLSが必要です。
-
[解決済み] java.lang.ClassNotFoundException: org.gradle.api.internal.plugins.DefaultConvention このエラーを修正するにはどうすればよいですか?
-
[解決済み] org.apache.kafka.common.KafkaException: カフカコンシューマーの構築に失敗した
-
属性値は一定でなければならない
-
[解決済み] JPA EntityManager。なぜmerge()ではなくpersist()を使うのか?
-
[解決済み] 文字列のリストに対するSpring Bootのyaml設定
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Bad Request - このホストとポートの組み合わせはTLSが必要です。
-
[解決済み] テンプレート "index "の解決に失敗しました。テンプレートが存在しないか、設定されたテンプレートリゾルバでアクセスできない可能性があります。
-
[解決済み] 宛先の JMS 接続を更新できませんでした。原因:認証に失敗
-
[解決済み] このリソースにアクセスするには、生成されたアクセストークンを使用して完全な認証を行う必要があります。
-
[解決済み] Bad Request - このホストとポートの組み合わせはTLSが必要です。
-
[解決済み] java.lang.ClassNotFoundException: org.gradle.api.internal.plugins.DefaultConvention このエラーを修正するにはどうすればよいですか?
-
[解決済み] org.apache.kafka.common.KafkaException: カフカコンシューマーの構築に失敗した
-
属性値は一定でなければならない
-
[解決済み] Entity上で@AllArgsConstructorと@NoArgsConstructorを併用する理由とは?
-
[解決済み] SpringBootのLogbackを無効にする