12

Java Web App に監査モジュールを作成する必要があります。HibernateではなくEclipseLinkを使用しています(Enversは使用できません)。JPAが実行しているSQLまたはJPQLを取得するためにいくつかの方法を検索したため、次のようなログを記録できました。

System.out.println("User " + user + " from " + ip_address + " executed " + jpa_statement + " at " + new Date());

実際には、この情報を履歴データベースのテーブルに保存します。そのため、いつでもこの情報を簡単に取得できます。そのため、「SHOW SQL」パラメータは私にとって十分ではありません。ソース コードで操作できるように、SQL 文字列が本当に必要です。

JPA 仕様でEntityListener機能を見つけ、ロギング コードを配置するのに最適な場所だと思いました。たとえば、postUpdate メソッドは、オブジェクトが更新された時間を記録できます。しかし、私の問題は、実行されたSQLを取得できないことです。

これが私が意味することの例です:

public class AuditListener {    
  @PostUpdate
  public void postUpdate(Object object) {
    User user = (User)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");
    String ip_address =  (User)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("ip_address");
    String jpa_statement = object.getSQL();
    System.out.println("User " + user + " from " + ip_address + " executed " + jpa_statement + " at " + new Date());
  }

}

しかし、「object.getSQL()」は存在しません。では、SQL ステートメントを取得するにはどうすればよいでしょうか。

誰かが私を正しい方向に向けることができれば、私は感謝します!

4

3 に答える 3

13

TopLinkでは、履歴追跡が完全にサポートされています。

http://wiki.eclipse.org/EclipseLink/Examples/JPA/Historyを参照して ください。

JPA イベントには、変更されたものは含まれず、オブジェクトのみが含まれます。

TopLinkはまた、postUpdateを定義するDesriptorEvents (DescriptorEventListenerを参照)もサポートしますが、変更を記述するObjectChangeSetを含みます。また、SQLおよびDatabaseRecordを含むUpdateObjectQueryもあります。

于 2011-10-13T14:50:17.317 に答える