11

しばらくの間、JPA を使用するときに、なぜ次のような削除メソッドを作成する必要があるのか​​疑問に思っていました。

@Transactional
public void delete(Account account)
{
    if (entityManager.contains(account))
    {
        entityManager.remove(account);
    }
    else
    {
        entityManager.remove(entityManager.merge(account));
    }
}

トランザクションはこのメソッドで開始および終了するため、contains は必要ないのかもしれませんが、remove で管理されていないオブジェクトだけを取得できなかったのはなぜなのか疑問に思っています。そのオブジェクトのIDを知るために管理する必要があるからですか? 他の洞察を聞くのは素晴らしいことです。JPA削除の方法と理由を理解したいだけです。

4

1 に答える 1

20

削除操作は、エンティティの関連付けにカスケードできます。

どの関連付けられたエンティティを削除するかを知るために、エンティティ マネージャは切り離されたエンティティに依存できません。これは定義上、この切り離されたエンティティはエンティティの最新の状態を反映しておらず、必ずしもすべてのエンティティを持っているとは限らないためです。カスケードされた関連付けが再帰的にロードされます。

したがって、切り離されたエンティティを受け入れた場合remove()は、切り離されたエンティティをマージし、切り離されたエンティティに含まれるものに基づいて削除操作を実行するか、切り離されたエンティティと同じ ID を持つエンティティを単にロードして実行するかを決定する必要があります。読み込まれたエンティティに基づく操作。

あなたに代わって決定するのではなく、添付されたエンティティが必要なだけです。そうすれば、あなたが望むものを決めることができます。

于 2013-04-18T17:38:38.697 に答える