如何审计Spring data jpa @Query?

2024-02-22

为了审核记录所有数据库更改,我们实现了 HibernateInterceptor(org.hibernate.Interceptor)。 我们可以记录使用 JpaRepository 执行的查询的审核

我们使用的拦截器 - 示例

import java.io.Serializable;
import java.util.Iterator;

import org.hibernate.CallbackException;
import org.hibernate.EntityMode;
import org.hibernate.Interceptor;
import org.hibernate.Transaction;
import org.hibernate.type.Type;

public class TestInterceptor implements Interceptor {

@Override
public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
        throws CallbackException {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState,
        String[] propertyNames, Type[] types) throws CallbackException {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
        throws CallbackException {
    // TODO Auto-generated method stub
    return false;
}

@Override
public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
        throws CallbackException {
    // TODO Auto-generated method stub

}

@Override
public void onCollectionRecreate(Object collection, Serializable key) throws CallbackException {
    // TODO Auto-generated method stub

}

@Override
public void onCollectionRemove(Object collection, Serializable key) throws CallbackException {
    // TODO Auto-generated method stub

}

@Override
public void onCollectionUpdate(Object collection, Serializable key) throws CallbackException {
    // TODO Auto-generated method stub

}

@Override
public void preFlush(Iterator entities) throws CallbackException {
    // TODO Auto-generated method stub

}

@Override
public void postFlush(Iterator entities) throws CallbackException {
    // TODO Auto-generated method stub

}

@Override
public Boolean isTransient(Object entity) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int[] findDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState,
        String[] propertyNames, Type[] types) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Object instantiate(String entityName, EntityMode entityMode, Serializable id) throws CallbackException {
    // TODO Auto-generated method stub
    return null;
}

@Override
public String getEntityName(Object object) throws CallbackException {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Object getEntity(String entityName, Serializable id) throws CallbackException {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void afterTransactionBegin(Transaction tx) {
    // TODO Auto-generated method stub

}

@Override
public void beforeTransactionCompletion(Transaction tx) {
    // TODO Auto-generated method stub

}

@Override
public void afterTransactionCompletion(Transaction tx) {
    // TODO Auto-generated method stub

}

@Override
public String onPrepareStatement(String sql) {
    // TODO Auto-generated method stub
    return null;
}

}

但是如果我们通过以下方式运行查询org.springframework.data.jpa.repository.Query该拦截器没有被调用。

是否可以审计/拦截使用以下命令执行的查询org.springframework.data.jpa.repository.Query

即我的存储库中有以下查询,这不会触发 Hibernate 拦截器

  @Transactional
  @Modifying
  @Query("DELETE from MyEntity my where my.id =?1")
  void deleteById(Long id);

要拦截 Spring 数据查询,请添加以下属性:

spring.jpa.properties.hibernate.session_factory.interceptor=com.yourpacakge.TestInterceptor

为了简单起见,我使用了一个从 EmptyInterceptor 扩展的拦截器类。

public class MyInterceptor extends EmptyInterceptor {
    @Override
    public String onPrepareStatement(String sql) {
        System.out.println("Query intercepted: " + sql);
        return super.onPrepareStatement(sql);
    }
}

DOCS: https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#configurations-session-events https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#configurations-session-events

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何审计Spring data jpa @Query? 的相关文章

随机推荐

  • 我可以在yield-return-method 中使用“using”吗?

    我刚刚看到了一个 YouTube 视频 其中导师使用了一个 Yield 返回方法来打开一个文件并从中读取行 这些行将 Yield 返回给调用者 实际代码位于 FileStream 周围的 using 块中 然后我想知道 在yield ret
  • 超时后消除反应错误消息

    我试图显示一些反应错误消息并在 5 秒超时后隐藏它们 下面是代码 import as React from react import ErrorInfo from Twilio api export const Error type mes
  • 在 C++ 中设置默认浮点打印精度

    我想在比较过程中控制双精度数的精度 然后使用 C 恢复到默认精度 我打算使用setPrecision 设置精度 那么将精度设置回默认值的语法 如果有 是什么 我正在做这样的事情 std setPrecision math log10 m F
  • 向 xml 文档添加注释

    Code from lxml import etree Create the network XML file tree root etree Element network tree etree ElementTree root Crea
  • 编译元素导致输入插入符位置移动到末尾

    我的指令有问题 该指令的目的是轻松添加验证 而无需手动将 ng class 除其他外 添加到元素中以便显示错误状态 我只是想在我的元素上放置一个 验证 指令 并在出现错误状态时生成适当的类 和错误消息 就验证而言 它运行良好 但会产生奇怪的
  • 自定义路由类

    在 symfony 1 4 中 您可以定义自定义路由类 在其中使用自定义逻辑覆盖 url 的生成 例如 custom class sfDoctrineRouteCollection options model Custom prefix p
  • 如何在jquery中选择一个元素及其子元素? [复制]

    这个问题在这里已经有答案了 我有一个 div 其中包含更多 div 这些 div 内部包含 table div 我怎样才能在jquery中选择这个父div及其子div 父 div 有类 AccordionTitle AccordionTit
  • 当我尝试使用 Rakudo 运行脚本时,为什么会出现“被零除”错误?

    我刚刚构建了 Rakudo 和 Parrot 这样我就可以使用它并开始学习 Perl 6 我下载了 Perl 6 书 并愉快地输入了第一个演示程序 网球锦标赛示例 当我尝试运行该程序时 出现错误 Divide by zero current
  • 即使活动发生变化,如何保持 Android 客户端与服务器的连接并向服务器发送数据?

    我最初在我的活动中实现了一个异步任务 将数据发送到服务器 但是当我改变活动时 连接就丢失了 为了避免这种情况 我的方法是实现一个集中网络操作并将数据发送到服务器的服务 该服务的代码如下 import java io BufferedWrit
  • Rxjs 将 Json 文档中的数组映射到新的数组类型

    我正在 Angular 服务中从 PouchDB 检索文档 该文档以以下格式检索 id segments rev 1 4f0ed65cde23fe724db13bea1ae3bb13 segments name Aerospace name
  • 并发 Sql Server 连接数

    我正在创建一个带有 Sql Server 数据库引擎的 net 应用程序 我希望每秒有数千名用户访问我的网站 连接数靠什么 IIS 和 Sql Server 可以容纳多少个连接 首先 连接和连接池之间存在区别 研究一下这一点是不是很好 因为
  • RabbitMQ 用户在预先创建的队列上发布/订阅的权限

    我有一个用例 我需要创建一个用户并授予他仅在现有队列上发布 订阅的权限 这是一个示例 虚拟主机 mainvhost 对于所有用户都相同 在虚拟主机内 我有 A foo 和 Q bar 队列 用户 foo 只能发布 订阅到 Q foo 用户
  • 如何断言不为空?

    我对 javascript 测试非常陌生 我想知道如何在中断言 not nullMocha框架 Mocha 支持您想要的任何断言库 您可以在此处查看它如何处理断言 http mochajs org assertions http mocha
  • Primefaces 仅更新选定的选项卡

    我有一种情况 当触发 选择 事件时 我想更新页面上的多个组件 However 其中两个位置位于 tabView 内 我只想更新这些组件 如果它们位于当前选定的选项卡内 我suspect我正在寻找的是这样的东西
  • 与“开始调试”相比,“附加到进程”有什么优势?

    我是编程新手 我知道之前只开始调试 也许启动调试套件以更好地开发一些小型应用程序 我发现 Visual Studio IDE 提供了另一种附加到进程的方法供使用 何时以及为何必须使用附加调试 比如多线程应用程序的调试 客户端 服务应用程序调
  • 如何读取大型 Sqlite 文件并从资产文件夹复制到 Android 模拟器或设备中?

    我想很多人已经读过这篇文章 在 Android 应用程序中使用您自己的 SQLite 数据库 http www reigndesign com blog using your own sqlite database in android a
  • ASP.Net 动态数据还是 MVC2?

    我一直在使用 Web 表单 并且我想根据一些事实和我在其中看到的其他优点切换到 MVC 模式 当我遇到最新的动态数据 过去称为动态数据模板 时 我对 MVC 审查进展顺利 如果我错了 请纠正我 但我相信在后端 MVC2 和 DD 都使用 M
  • 在其他桌面、Python、Windows 上启动进程

    我创建了第二个桌面 import win32api win32con win32gui win32service win32process import pywintypes import traceback thread time cSt
  • CloudKit - 具有依赖项的 CKQueryOperation

    我刚刚开始使用 CloudKit 所以请耐心等待 背景信息 苹果在 WWDC 2015 上发表了有关 CloudKit 的演讲https developer apple com videos wwdc 2015 id 715 https d
  • 如何审计Spring data jpa @Query?

    为了审核记录所有数据库更改 我们实现了 HibernateInterceptor org hibernate Interceptor 我们可以记录使用 JpaRepository 执行的查询的审核 我们使用的拦截器 示例 import ja