使用合并持久性单元管理器后未调用休眠事件侦听器

Posted

技术标签:

【中文标题】使用合并持久性单元管理器后未调用休眠事件侦听器【英文标题】:Hibernate Event Listeners not called after using Merging Persistence Unit Manager 【发布时间】:2012-04-05 13:55:16 【问题描述】:

我有一个组件被开发并添加为我们项目的依赖项...我需要使用该组件中指定的实体,为了做到这一点,我必须使用 Spring data-jpa 项目中的 MergingPersistenceUnitManager。 该组件定义了一个persistence.xml,其unitName 与使用它的父项目相同。 现在,我有两个persistence.xml 文件,它们都是在EntityManagerFactory 创建期间使用MergingPersistenceUnitManager 加载的。

一切正常,在容器启动期间加载并检测到实体... 但是,我在这里面临的问题是,我声明的休眠侦听器根本没有被调用。它们似乎从未被调用过,并且我已经验证了如果我删除组件并且只有一个 persistence.xml 文件它们可以工作。

<persistence-unit name="LineManagement" transaction-type="RESOURCE_LOCAL">
        <properties>
            <property name="hibernate.id.new_generator_mappings" value="true"     />
            <property name="hibernate.current_session_context_class"     value="thread" />
            <property name="hibernate.default_batch_fetch_size" value="1000" />
<property name="hibernate.cache.use_second_level_cache" value="true" />
            <property name="hibernate.cache.use_query_cache" value="true" />
            <property name="hibernate.cache.use_structured_entries" value="true" />
            <property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory" />
            <property name="hibernate.cache.provider_configuration_file_resource_path" value="/ehcache.xml" />

            <property name="hibernate.ejb.event.pre-update" value="com......dao.listener.ChangeHistoryMultiSelectListener" />
            <property name="hibernate.ejb.event.pre-insert" value="com......dao.listener.LMCoreEntityAuditListener" />

        <!-- General Debugging -->
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.generate_statistics" value="true" />
        </properties>
    </persistence-unit>

第二个persistence.xml就是这个

    <persistence-unit name="LineManagement" transaction-type="RESOURCE_LOCAL">
    </persistence-unit>

我意识到,在我开始使用 MergingPersistenceUnitManager 之后,我的听众永远不会被调用... 这是其中一个的 sn-p。

public class LMCoreEntityAuditListener
      implements PreInsertEventListener, PreUpdateEventListener, Initializable 
   private static final String MODIFIED_BY = "modifiedBy";
   private static final String CREATED_BY = "createdBy";

   @Override
   public boolean onPreInsert(final PreInsertEvent event) 
      System.out.println("ssss");
      if (!(event.getEntity() instanceof LMBaseEntity)) 
         return false;
      
      final LMBaseEntity entity = (LMBaseEntity) event.getEntity();
      if (!(entity instanceof GlobalLine) || (entity.getCreatedTimestamp() == null)) 
         // auditCreates(entity);
         final String user = SecurityContextUtil.getOriginalUser();
         final List<String> props = Arrays.asList(event.getPersister().getPropertyNames());
         event.getState()[props.indexOf(CREATED_BY)] = user;
         event.getState()[props.indexOf(MODIFIED_BY)] = user;
      

      return false;
   

任何帮助将不胜感激。也许我缺少一些基本的东西。依赖项已正确配置。

【问题讨论】:

【参考方案1】:

spring 数据中的 MergingPersistenceUnitManager 没有合并属性。

https://github.com/SpringSource/spring-data-jpa/blob/master/src/main/java/org/springframework/data/jpa/support/MergingPersistenceUnitManager.java

将其与以下包含属性的合并单元管理器示例进行比较。

https://dev.c-ware.de/confluence/display/PUBLIC/Multiple+persistence.xml+in+a+multi-module+application

【讨论】:

好观察!你介意打开一个 JIRA 来添加它以确保完整性吗?谢谢!

以上是关于使用合并持久性单元管理器后未调用休眠事件侦听器的主要内容,如果未能解决你的问题,请参考以下文章

表格单元格事件侦听器

如何将事件侦听器添加到 ag 网格单元格内的元素(使用 js 或 jquery,不是 angular,不是 reactjs,不是 vue)

如何删除某些元素的所有事件侦听器而不使用其子元素

为啥没有为 primefaces SelectManyCheckbox 调用事件侦听器?

在 initComponent 中声明时,事件侦听器未调用控制器方法

react-datepicker“无法阻止被动事件侦听器调用中的默认值”