And*_*dré 12 audit jpa eclipselink entitylisteners show-sql
我需要为我的Java Web App 制作一个审计模块.我使用EclipseLink,而不是Hibernate(不能使用Envers).我搜索了很多方法来获取JPA正在执行的SQL或JPQL,所以我可以记录这样的事情:
System.out.println("User " + user + " from " + ip_address + " executed " + jpa_statement + " at " + new Date());
Run Code Online (Sandbox Code Playgroud)
实际上,我会将此信息保存到历史数据库的表中.因此,我可以随时轻松检索此信息.这就是为什么" SHOW SQL "参数对我来说还不够.我真的需要SQL字符串,所以我可以在我的源代码中操作它.
我在JPA spec中找到了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());
}
}
Run Code Online (Sandbox Code Playgroud)
但是"object.getSQL()"不存在.那么如何获取SQL语句呢?
如果有人能指出我正确的方向,我将不胜感激!
Jam*_*mes 13
EclipseLink完全支持历史记录跟踪.
请参阅 http://wiki.eclipse.org/EclipseLink/Examples/JPA/History
JPA事件不包含已更改的内容,仅包含对象.
EclipseLink还支持DesriptorEvents(参见DescriptorEventListener),它也定义了postUpdate但包含描述更改的ObjectChangeSet,还有包含SQL和DatabaseRecord的UpdateObjectQuery.
小智 6
审计的好处很好,但我认为,可以有更好的审计解决方案.在Envers中有一些缺点:每个表有两个db表.但很少使用第二张表.对于600多个表的大型企业项目来说,这是个问题.Envers仅适用于数据库更改.当我需要解决其他应用程序组件的审计时,我需要不同的审计解决方案.对馆藏的审核并不理想.何时更改数据库模式我也必须更改审计表.我可以丢失一些审计信息,或者我有很多工作要将新的审计信息更新到新模式.将审计信息保存到同一数据库是耗费时间和空间的.
我开始研究小型审计库,其中信息存储在MongoDB数据库中:对所有hibernate对象使用一个集合.存储对象的每个值.审计是在不同的线程中完成的.集合(ID列表)也存储.相同的MongoDB数据库用于其他应用程序日志.
有人对这个或类似的解决方案有一些经验吗?
| 归档时间: |
|
| 查看次数: |
8135 次 |
| 最近记录: |