1

私はこの JPAServiceImpl メソッドを持っています:

@Override
@Transactional
public void createPageContent(SellerContent content, long userId) {

    Seller s = em.find(Seller.class,userId);
    content.setSeller(s);

    content.setSeller(s);
    s.addContent(content);
}

それは機能しますが、またはがないので、どのように機能するのだろう em.merge(seller)em.persist(content)

売り手は、SellerContent 関係で CascadeType.ALL を取得しています。

これが正常な動作であるかどうか、説明していただけますか? em.merge(seller)と の両方を書いたでしょうem.persist(content)。違いますか?

たとえば、次のメソッドを書きました。

@Override
@Transactional
public void createFeedback(CartLine cartLine, String feedbackString) {
    Product product = cartLine.getProduct();

    Feedback feedback = new Feedback();
    feedback.setFeedbackContent(feedbackString);
    feedback.setCartLine(cartLine);
    cartLine.setFeedback(feedback);
    product.getFeedbacks().add(feedback);
    feedback.setProduct(product);

    em.persist(feedback);
    em.merge(cartLine);
    em.merge(product);
}        

このメソッドでは、マージと永続化の手順を記述しました。違いますか?

4

2 に答える 2

2

Seller同じトランザクションでエンティティマネージャーを介してオブジェクトが読み込まれるため、機能します。実行時に、プロキシ オブジェクトに置き換えられます。このオブジェクトの各変更は、トランザクションの終了時に自動的に永続化されます。非常に簡単に確認できます。実行時にcreatePageContentメソッドにブレークポイントを作成し、実際のSeller s変数の型を確認します。次のことのために必要なプロキシになります。

  • 状態のすべての変化を検出しSeller sます (例: s.addContent(content))。トランザクションの最後にこれらの変更を永続化します。
  • レイジー リレーションを読み込みます。Sellerのhas リストを想像してみてくださいOwner。実行時のデフォルトでは、このリストは空です。実行した瞬間に正確にロードされますs.getOwners().iterator()

したがって、通常は、キーワードem.persist()を使用して作成されたインスタンスに対してのみ呼び出す必要があります。newほとんどの場合、これも必要ありません。新しいオブジェクトAを永続化されたオブジェクトにアタッチしてBから呼び出すことができますem.persist(B)Aカスケードによって永続化されます。

コードの 2 番目のブロック:

  • em.merge安全に通話を削除できると思います。必要な場合にのみマージしますCartLine mergedCartline = em.merge(cartLine); mergedCartline.doSomething()
  • em.persist(feedback)次の場合は、呼び出しを削除できます。a )CartLine cartLine常にエンティティ マネージャー経由で読み込まれる。b)cartLine.feedbackカスケードによってプロパティを永続化できます(マッピングによって異なります)。
于 2013-09-02T12:20:41.013 に答える