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 ステートメントを取得するにはどうすればよいでしょうか。
誰かが私を正しい方向に向けることができれば、私は感謝します!