在Hibernate的EmptyInterceptor中注入JPA的实体管理器

2023-12-22

我在数据访问层中使用 JPA-2.0 和 Hibernate。

出于审计日志记录的目的,我通过在 persistence.xml 中配置以下属性来使用 Hibernate 的 EmptyInterceptor:

<property name="hibernate.ejb.interceptor"  
                value="com.mycom.audit.AuditLogInterceptor" /> 

Where 审计日志拦截器扩展了 hibernate 的 'org.hibernate.EmptyInterceptor'.

public class AuditLogInterceptor extends EmptyInterceptor {  

    private Long userId;  

    public AuditLogInterceptor() {}  

    @Override  
    public boolean onSave(Object entity, Serializable id, Object[] state,  
            String[] propertyNames, Type[] types) throws CallbackException {  
        // Need to perform database operations using JPA entity manager
        return false;  
    }  

   @Override
    public boolean onFlushDirty(Object entity, Serializable id,
            Object[] currentState, Object[] previousState,
            String[] propertyNames, Type[] types) {
        // other code here        
        return false;
    }

    @Override  
    public void postFlush(Iterator iterator) throws CallbackException {  
        System.out.println("I am on postFlush");
        // other code here 
    }  
}  

我在数据访问层使用 JPA 实体管理器来执行数据库操作。 JPA配置如下:

<bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        p:persistenceUnitName="PersistenceUnit"
        p:persistenceXmlLocation="classpath*:persistence.xml"
        p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaAdapter">
        <property name="loadTimeWeaver">
            <bean
                class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
        </property>
    </bean>

我的 AbstractDAO 是:

public class AbstractDao<T, ID extends Serializable> {

    private final transient Class<T> persistentClass;

    protected transient EntityManager entityManager;

    @SuppressWarnings("unchecked")
    public AbstractDao() {

        this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    @PersistenceContext
    public final void setEntityManager(final EntityManager entityMgrToSet) {

        this.entityManager = entityMgrToSet;
    }

    public final Class<T> getPersistentClass() {

        return persistentClass;
    }

    public final void persist(final T entity) {

         entityManager.persist(entity);       
    }

}

我想在“AuditLogInterceptor”中注入 JPA 实体管理器,以便我可以像我的抽象 DAO 一样在“AuditLogInterceptor”中执行数据库操作。

任何想法?正确的解决方案应该是什么?


我有一个简单的方法来使用“AuditLogInterceptor”中的 JPA 实体管理器执行数据库操作

我创建了下面的类,它将提供应用程序上下文引用:

@Component("applicationContextProvider")
    public class ApplicationContextProvider implements ApplicationContextAware {
        private static ApplicationContext context;

        public static ApplicationContext getApplicationContext() {
            return context;
        }

        @Override
        public void setApplicationContext(ApplicationContext ctx) {
            context = ctx;
        }
    }

创建的数据访问类:

@Repository("myAuditDAO")
public class myAuditDAO<T, ID extends Serializable> {

    private final transient Class<T> persistentClass;

    protected transient EntityManager entityManager;

    @SuppressWarnings("unchecked")
    public MyDAO() {

        this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    @PersistenceContext
    public final void setEntityManager(final EntityManager entityMgrToSet) {

        this.entityManager = entityMgrToSet;
    }

    public final Class<T> getPersistentClass() {

        return persistentClass;
    }

    public final T findById(final ID theId) {

        return entityManager.find(persistentClass, theId);
    }

    public final void persist(final T entity) {

        entityManager.persist(entity);
    }

    public final void merge(final T entity) {

        entityManager.merge(entity);
    }
}

并使用“AuditLogInterceptor”中的“ApplicationContextProvider”来获取“MyAuditDAO”的引用,该引用将 JPA 实体管理器作为在 DAO 初始化期间注入的属性。现在,在“MyAuditDAO”的帮助下,我可以执行数据库操作。

public class AuditLogInterceptor extends EmptyInterceptor {  

    @Override  
    public void postFlush(Iterator iterator) throws CallbackException {  

      // Here we can get the MyAuditDao reference and can perform persiste/merge options
       MyAuditDao myAuditDao = (MyAuditDao ) ApplicationContextProvider.getApplicationContext().getBean("myAuditDao");

      //  myAuditDao.persist(myEntity);

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

在Hibernate的EmptyInterceptor中注入JPA的实体管理器 的相关文章

随机推荐

  • 编写简单语言的解析器

    我正在尝试设计一种类似于嘴唇 模式的简单语言 我已经写了它的词法分析器 tokenizer 我可以分为运算符 标识符等 但我现在尝试编写解析器 对于这一点 我只举一个例子就足够了 有人可以给我一个java代码的例子吗 此外 每个人都提到了a
  • 如何处理 scss 项目中的部分内容?

    以下问题 在我的服务器上 我在主目录中有一个 style scss 文件 我使用sass watch style scss style css style compressed因此每次编辑 style scss 时都会创建一个新的 styl
  • 如何获取 SharePoint 工作流中的参数

    我正在尝试创建一个带有输出参数的自定义工作流程操作以进行错误处理 根据各种示例 我无法让 Parameter Direction Out 工作 一切似乎都正确 但当我尝试将输出分配给 SharePoint Designer 中的 错误 变量
  • Windows:如何查询低级键盘挂钩中修饰键的状态?

    对于 USB 键盘配置工具 我需要拦截所有键盘输入并检测同时按下哪些修饰键和普通键 因此 我使用 Windows 低级挂钩 WH KEYBOARD LL 它工作正常 只是我无法确定 WIN 键 VK LWIN VK RWIN 是否被按下 c
  • 如何为未知长度的输入字符串分配内存?

    这是结构 typedef struct friend char firstname char lastname char birthdate 9 friend 我对如何让用户输入字符串并将其放置在friend结构为firstname or
  • SSIS 2012 未找到方法:无效

    最近 当我想打开 OLE DB 源组件时 我在每个 SSIS 包 使用 Visual Studio 2012 中都遇到此错误 Method not found Void Microsoft DataTransformationService
  • Mono / Ubuntu - 定义冲突

    我正在尝试在 Ubuntu 上构建一个库 Medsphere Widgets 但它抛出了一个错误 我已经进行了很好的搜索 但似乎没有人能找到答案 配置脚本工作正常 并且完成时没有警告或错误 当我去运行 make 时 它 会执行以下操作 po
  • 复制项目行为不一致?

    考虑这个目录结构 C temp A file txt C temp B 如果我运行命令 Copy Item C temp A C temp B A Recurse Force ErrorAction Stop I have C temp A
  • 如何在 Google Dialogflow Fullfilment 内联编辑器中安装 npm 包

    我想在我的聊天机器人中安装一些 npm 包 但我无法使其工作 package json 文件如下所示 name dialogflowFirebaseFulfillment description This is the default fu
  • 埃尔兰的哲学家餐厅

    如果您以前看过 哲学家就餐 那么您就会知道有几种方法可以做到这一点 我的实现创建了与消息传递进行通信的哲学家和分叉进程 我有很多关于分叉和哲学家进程格式的程序 但我自己弄清楚了 现在我将分享完成的代码 我是初学者仅供参考 祝你今天过得愉快
  • java构造函数有什么意义?

    所以我正在学习java 我已经一个月了 我刚刚了解了构造函数 但我不明白创建一个的全部目的 我为什么以及何时想要使用它 我的整体想法是它没有 main 方法 您可以从主类中调用构造函数 任何人都可以就这个话题启发我 这对我有很大帮助 构造函
  • PHP,通过POST传递数组

    这是通过以下方式发送数组的最安全的方式POST foreach id as array
  • 如何用斜杠“/”替换反斜杠“\”?

    在我的代码中我想替换反斜杠字符 通过正斜杠字符 在一个字符串中 我尝试过以下代码 string str chosen file Replace where chosen file is a string其中包含大量出现的 特点 但它似乎不起
  • 猕猴桃屏幕。我必须用 super 初始化吗?

    来自docs https kivy org docs api kivy uix screenmanager html Declare both screens class MenuScreen Screen pass class Setti
  • wsimport 不使用复杂的输入类型

    当我使用 wsimport 为某些服务生成代理时 每个端口的生成方法签名似乎没有使用 WSDL 中指定的复杂类型 但我注意到其他一些服务确实如此 多种服务都发生过这种情况 但最近的例子是亚马逊的 AWSEConsumerService 链接
  • 将 YUI3 与 HTTPS 结合使用的“正确”方法是什么?

    我对 YUI2 有丰富的经验 并且正在快速了解 YUI3 我正在编写的服务需要 HTTPS 但普通的 YUI 体验是从雅虎的 HTTP only CDN 加载的 当浏览器尝试将 HTTPS 页面与 HTTP javascript 混合时 它
  • 使用 javascript 设置响应头

    我在从应用程序中的 URL 收集 json 值时遇到问题 当我尝试获取它们时 控制台中会显示错误日志 指出 access control allow origin 不允许来源 我研究了一下 发现响应标头必须设置为 Access Contro
  • 在 iOS 5 中的地图上放置 CLPlacemark

    在 iOS 5 中 有一种转发地理编码地址的新方法 将 1 Infinite Loop CA USA 等地址转换为 lat lang 地址 有关此的更多信息请参见此处 http developer apple com library ios
  • 在 mac 中通过应用程序(.jar)读取/写入文件时出现权限被拒绝错误

    我在 swing 中创建了一个应用程序 还为同一应用程序创建了一个安装程序 安装程序和应用程序都可以在 Windows 系统上完美运行 但我的问题是 当我尝试在 mac os 中运行它时 它并不能完美地处理所有数据 我发现在我的应用程序中我
  • 在Hibernate的EmptyInterceptor中注入JPA的实体管理器

    我在数据访问层中使用 JPA 2 0 和 Hibernate 出于审计日志记录的目的 我通过在 persistence xml 中配置以下属性来使用 Hibernate 的 EmptyInterceptor