Как определить изменения коллекции в Hibernate PostUpdateEventListener? - PullRequest
4 голосов
/ 01 мая 2009

В Hibernate реализация PostUpdateEventListener позволяет подключаться к рабочему процессу Hibernate и дает вам возможность проверять и сравнивать старые и новые значения свойств сущности по мере ее сохранения ( PostUpdateEvent имеет методы getOldState () и getState () , которые возвращают массив этих значений). Для стандартных свойств это работает просто отлично. Однако, если одно из этих свойств представляет собой коллекцию, чье содержимое изменилось, это не поможет: «старое значение» и «новое значение» являются одной и той же ссылкой на коллекцию (поскольку коллекция Сам не изменился, только его содержание). Это означает, что вы можете видеть только самое последнее, то есть «новое» содержимое этой Коллекции.

Кто-нибудь знает, существует ли способ определить, как элементы коллекции, принадлежащие сущности, изменились на этом этапе рабочего процесса?

Ответы [ 2 ]

6 голосов
/ 04 мая 2009

Я нашел способ сделать это, поэтому я опубликую его на случай, если он кому-нибудь пригодится. Этот код перебирает все свойства «старого состояния», и для любых, которые являются постоянными коллекциями, получает предыдущий контент «снимок». Затем он оборачивает это в неизменяемую коллекцию для хорошей меры:

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
  }   
2 голосов
/ 10 марта 2015

Кажется, что есть интерфейс, предназначенный для захвата изменений коллекции.

Реализация журнала аудита Полная

 public void onPreUpdateCollection(PreCollectionUpdateEvent event) {
    if (bypass(event.getAffectedOwnerOrNull().getClass())) {
        return;
    }
    CollectionEntry collectionEntry = getCollectionEntry(event);    
 }


 protected CollectionEntry getCollectionEntry(AbstractCollectionEvent event) {
     return event.getSession().getPersistenceContext()
            .getCollectionEntry(event.getCollection());
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...