web-dev-qa-db-ja.com

エンティティでのロンボクの@Dataと@Builderの使用

私は以下を使用しています:

@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を同時に使用することはできませんか?

10
Jan Galinski

コメントをまとめて、自分の質問に答えます。

まず、@ RoelSpilkerのおかげで、AllArgs-およびNoArgs-コンストラクターを明示的に提供する場合、1つのPojoでビルダーとデータを一緒に使用できます。

 @RequiredArgsConstructor
 @NoArgsConstructor
 @Data
 @Builder
 public class Person {...}

ただし、このクラス用に作成されたビルダーは、継承されたフィールドを認識しません。私のユースケース(いくつかのAbstractEntitiesを持っている)の場合、これはソリューションを役に立たなくし、今のところ手動ヘルパー/ビルダーに固執します。

1
Jan Galinski

このコードをlombokバージョン1.16.18以上で試してください:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class User {
    private String id;
    private String firstName;
    private String lastName;
}
10
장재훈

そのことに注意してください データオブジェクトはエンティティではありません !簡単に言えば、ハッシュコード/等号(idフィールドを考慮する場合)と、エンティティの遅延ロードされた部分を持つtoStringメソッドに問題があります。参考までに、 Vlad Mihalceasの記事 を確認してください。

あなたがすべき:

  • ハッシュコード/等しいからIDフィールドを除外する
  • 特定のエンティティで管理されていない関連フィールドをハッシュコード/等しいから除外する
  • すべての遅延読み込みフィールドをtoStringメソッドから除外する
  • toStringメソッドから循環参照を引き起こす可能性のあるフィールドを除外します

手書きまたは生成されたequals/hashcodeメソッドが問題ないことを確信する前に、JPAが「 ダーティチェック を実行する方法」のトピックに関する少なくとも何かを必ずお読みください。

1
Lubo

ロンボクのドキュメントでは、次のように記述されています。

この構文を目的に使用していますか?あなたの説明によると、それは事実ではなく、あなたが得るエラーを説明できますか?

0
Xendar