hibernate - 如何确定 Hibernate PostUpdateEventListener 中的集合更改?

标签 hibernate

在 Hibernate 中,实现一个 PostUpdateEventListener 允许您插入 Hibernate 的工作流程,并让您有机会在保存时检查和比较实体属性的旧值和新值( PostUpdateEvent 具有方法 getOldState() getState() 返回这些值的数组)。对于标准属性,这很好用。但是,如果这些属性之一是内容已更改的集合,则这无济于事:“旧值”和“新值”都只是对集合的相同引用(因为集合本身没有改变,只是其内容)。这意味着您只能看到该集合的最新内容,即"new"内容。

任何人都知道是否有办法确定实体拥有的集合的元素在工作流中的这一点发生了怎样的变化?

最佳答案

我想出了一个方法来做到这一点,所以我会发布它以防其他人使用它。此代码循环遍历所有“旧状态”属性,对于任何持久集合,获取之前的内容“快照”。然后将其包装在一个不可修改的集合中以进行良好的衡量:

public void onPostUpdate( PostUpdateEvent event )
{       
   for ( Object item: event.getOldState() )
   {
      Object previousContents = null;

      if ( item != null && item instanceof PersistentCollection )               
      {
         PersistentCollection pc = (PersistentCollection) item;
         PersistenceContext context = session.getPersistenceContext();            
         CollectionEntry entry = context.getCollectionEntry( pc );
         Object snapshot = entry.getSnapshot();

         if ( snapshot == null )
            continue;

         if ( pc instanceof List )
         {
            previousContents = Collections.unmodifiableList( (List) snapshot );
         }        
         else if ( pc instanceof Map )
         {
            previousContents = Collections.unmodifiableMap( (Map) snapshot );
         }
         else if ( pc instanceof Set )
         {  
            //Set snapshot is actually stored as a Map                
            Map snapshotMap = (Map) snapshot;
            previousContents = Collections.unmodifiableSet( new HashSet( snapshotMap.values() ) );          
         }
         else
           previousContents = pc;

      //Do something with previousContents here
  }   

关于hibernate - 如何确定 Hibernate PostUpdateEventListener 中的集合更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/812364/

相关文章:

java - 如何映射列数多于表的 native 查询?

java - 如何在spring boot-JPA-hibernate中获取所有表元数据?

java - 具有最大值的实体的 HQL 查询

hibernate - 在 Grails 中配置 Postgres

java - 如何解决java.lang.NoClassDefFoundError : javax/annotation/Generated?

java - 使用 JPA/Hibernate 过滤 DataSet 中的行

java - JPA Criteria Query - 如何在两个表上实现联接以在单个查询中获得所需的结果

java - JPA/Hibernate 返回 BigDecimal 不长

java - 如何正确地将特定对象的列表转换为 Gson?

Spring Data JPA 自定义查询限制功能不起作用