我需要为我的 Java Web App创建一个审计模块。我使用 EclipseLink,而不是 Hibernate(不能使用 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 语句呢?
如果有人能指出我正确的方向,我将不胜感激!