2

エンティティのリストが 2 つあります。1 つは DB 内の行の現在の状態で、もう 1 つはリストに加えられた変更です。削除、追加、およびエンティティに加えられた変更を監査するにはどうすればよいですか? 私の監査テーブルはすべてのエンティティで使用されています。

エンティティ リスナーと Callback メソッドは完全に適合しているように見えますが、次の文に気付くまでは: A callback method must not invoke EntityManager or Query Methods! この制限により、監査を収集することはできますが、データベースに永続化することはできません:(

私の解決策は、監査を発見するための複雑なアルゴリズムでした。

If the entity is in the change list and has no key, it's an add

If the entity is in the db but not the changes list, it's a delete

If the entity is in both list, recursively compare their fields to find differences to audit (if any)

これらを収集し、変更リストをマージするのと同じトランザクションで DB に挿入します。しかし、私はこれを手で書いているという事実が嫌いです。JPAは私のためにこのロジックを実行できるはずです。

私たちが思いついた解決策の 1 つは、監査を JMS キューに送信するエンティティ リスナーを使用することです。その後、キューは監査をデータベースに挿入します。しかし、JMS キューを設定するのが面倒だと思うので、この解決策は好きではありません。とはいえ、これが現時点での最善の解決策です。


私はeclipselinkを使用しています(理想的には、それは関係ありません)、役立つように見えるこれら2つのことを見つけましたが、JMSキューはそれらよりも優れたソリューションです:

4

1 に答える 1

0

EntityListener は、監査情報を収集できるため、良いアプローチのように見えます。

変更を永続化するトランザクションとは別のトランザクションで情報を永続化しようとしましたか? おそらくステートレス EJB への参照を取得し (EJB を使用していると仮定)、@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) でマークされたメソッドを使用します。このようにして、元の変更を永続化するトランザクションは、監査のトランザクションが完了するまで保留されます。元の監査トランザクションがまだコミットされていないため、この別の監査トランザクションでは更新された情報にアクセスできないことに注意してください。

于 2013-05-10T21:48:32.260 に答える