4

私のcrudコントローラーでは、更新操作中に次のことが起こっています

クライアントは「POST /{id}」へのリクエストを行い、リクエスト本文内で DTO を送信します。次に、ModelMapper を呼び出して、DTO をデータベース エンティティに変換します。その後、entity の Id フィールドを、クライアントから送信された 1 つに設定しました。リポジトリの保存を行います。

自動生成されたフィールドを手動で設定しようとしているため、これは失敗します (更新ではなく、新しいエンティティを作成します)。JPA EntityManager には merge メソッドがありますが、それが私が望むものかどうかはわかりません。

そこで、コードを次のように変更します。最初に要求された ID を持つエンティティを取得し、次に ModelMapper にそのフィールドを上書きするように要求し、最後にリポジトリの保存を行います。ただし、新しいインスタンスを構築する代わりに、ModelMapper に既存のオブジェクトを更新させることはできませんでした。ドキュメントによると可能に見えますが、プロバイダーとタイプマップの間で迷子になりました。

したがって、私が望むのは、JPAに一時的なエンティティで更新を行うよう説得するか、ModelMapperに既存の(およびjpaが添付された)エンティティのフィールドを設定するよう説得することです。

単純なタスクがこれほど複雑になったという事実は、私が何か根本的に間違ったことをしているのではないかと疑っています。解決策を教えてもらえますか?

4

1 に答える 1

0

スキップをお探しですか?

public static void main(String[] args) {
    ModelMapper mapper = new ModelMapper();
    mapper.addMappings(new PropertyMap<B, A>() {
        @Override
        protected void configure() {
            skip(destination.getId());
        }
    });
    A a = new A(5, 15);
    B b = new B(7, 17);
    mapper.map(b, a);
    System.out.println(a.id); // prints 5
    System.out.println(a.x);  // prints 17
}

static class A {
    private int id;
    private long x;

    public A() {
    }

    public A(int id, long x) {
        this.id = id;
        this.x = x;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public long getX() {
        return x;
    }

    public void setX(long x) {
        this.x = x;
    }
}

static class B {
    // exact copy of A
}
于 2016-02-01T10:39:19.540 に答える