0

EnityManager を使用してオブジェクトを削除する際に問題があります。名前のようなパラメーターがあります。ユーザーにこのパラメーターを追加してから削除すると、正常に機能します。ただし、EntityManager は削除されたパラメーターの ID を記憶します (ID は主キー - 自動インクリメント)。そして、ユーザーにこのパラメーターをもう一度追加すると、EntityManager はデータベースに行を追加しますが、最初の persit() の ID を保持します。したがって、パラメーター値をもう一度削除すると、EM はパラメーターを削除しません。EM は最初のパラメーターの ID を記憶しているため、この ID を持つパラメーターはありません。

私のソースコードは次のとおりです。

   if (!param.isParameterFilled()) {
        if (param.getId() != null) {
            param = getEmGap().merge(param);
            getEm().remove(param);
            getEm().flush();
        }
        return;
    }
    if (param.getId() == null) {
        getEm().persist(param);
    } else {
        getEm().merge(param);
    }
    getEm().flush();
}

おそらく問題は条件に関連しています: if(param.getId() == null) - この場合 (最初に追加して削除した後) id != null - > しかし、DB には EM が認識している id を持つパラメータはありません。そして、私はこの問題を解決する方法がわかりません。この場合、EMがどのように機能するかわかりませんか?remove() および flush() が呼び出された後、EM は Id = null を設定する必要があります。それとも、persist() と flush() でパラメータの ID をリロードする必要がありますか?

ありがとう

4

1 に答える 1

1

オブジェクトの転生はお勧めしません。新しいオブジェクトを永続化する場合は、新しいオブジェクトを作成して永続化し、以前に削除されたインスタンスを使用しないでください。インスタンスを削除すると、オブジェクトが存在しなくなるため、アプリからのものを含め、インスタンスへの参照はなくなります。

また、同じトランザクションで同じ ID を持つオブジェクトを削除して永続化することは、通常はお勧めできません。可能であれば、新しいオブジェクトごとに一意の ID を使用してみてください。

エラーを確認するには、同じトランザクションで同じ ID を持つ同じオブジェクトを 2 回削除し、それを 1 回永続化します。2 回目の削除は機能しませんか? 何が機能しないのか、エラーが発生するのか、それとも SQL DELETE ステートメントが生成されないのか? どの JPA プロバイダーとバージョンを使用していますか? 同じトランザクションではなく、別々のトランザクションを試すことはできますか?

于 2013-06-10T13:36:31.220 に答える