如何审核Spring数据jpa @Query? [英] How to Audit Spring data jpa @Query?

查看:80
本文介绍了如何审核Spring数据jpa @Query?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

To Audit log all the DB changes , we have implemented Hibernate Interceptor(org.hibernate.Interceptor) . We can able to log the audit for the query executed using JpaRepository

拦截器我们使用了-样本

Interceptor We have used- Sample

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运行查询,则不会调用拦截器.

But if we run the query via org.springframework.data.jpa.repository.Query that interceptor is not getting called.

是否可以审核/拦截使用org.springframework.data.jpa.repository.Query

Is this possible to Audit/Intercept the Query Executed using org.springframework.data.jpa.repository.Query

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

i.e I have the following Query in my Repository, this is not triggering Hibernate Interceptor

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

推荐答案

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

To intercept spring data queries add this prop:

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

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

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

I used an interceptor class that extends from EmptyInterceptor just for simplicity.

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

这篇关于如何审核Spring数据jpa @Query?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆