私は以下を使用しています:
@Entity
@Data
@Builder
@NoArgsConstructor(force = true)
public class User {
private String id;
private String firstName;
private String lastName;
}
私が達成したいこと:JPAを使用するには、noArgConstructor、getters/settersおよびequals/hashCode/toStringを備えたPOJOが必要です。
インスタンスの作成(例:テスト)では、User.builder()。build();を使用したいと思います。
問題:コンパイルされません。NoArgConstructorとRequiredFieldsConstructorに問題があるようです:
Error:(15, 1) Java: constructor User in class x.y.z.User cannot be applied to given types;
required: no arguments
found: Java.lang.String,Java.lang.String,Java.lang.String,Java.lang.String,Java.lang.String
reason: actual and formal argument lists differ in length
更新:new
を介して新しいエンティティを作成しようとすると、エラーが発生します... builder()が機能します。
私は何を見逃していますか? @ Data、@ Entity、@ Builderを同時に使用することはできませんか?
コメントをまとめて、自分の質問に答えます。
まず、@ RoelSpilkerのおかげで、AllArgs-およびNoArgs-コンストラクターを明示的に提供する場合、1つのPojoでビルダーとデータを一緒に使用できます。
@RequiredArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class Person {...}
ただし、このクラス用に作成されたビルダーは、継承されたフィールドを認識しません。私のユースケース(いくつかのAbstractEntitiesを持っている)の場合、これはソリューションを役に立たなくし、今のところ手動ヘルパー/ビルダーに固執します。
このコードをlombokバージョン1.16.18以上で試してください:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class User {
private String id;
private String firstName;
private String lastName;
}
そのことに注意してください データオブジェクトはエンティティではありません !簡単に言えば、ハッシュコード/等号(idフィールドを考慮する場合)と、エンティティの遅延ロードされた部分を持つtoStringメソッドに問題があります。参考までに、 Vlad Mihalceasの記事 を確認してください。
あなたがすべき:
手書きまたは生成されたequals/hashcodeメソッドが問題ないことを確信する前に、JPAが「 ダーティチェック を実行する方法」のトピックに関する少なくとも何かを必ずお読みください。
ロンボクのドキュメントでは、次のように記述されています。
この構文を目的に使用していますか?あなたの説明によると、それは事実ではなく、あなたが得るエラーを説明できますか?