|
16 | 16 | package org.grails.orm.hibernate.support;
|
17 | 17 |
|
18 | 18 |
|
19 |
| -import grails.gorm.dirty.checking.DirtyCheck; |
| 19 | +import org.grails.datastore.gorm.events.AutoTimestampEventListener; |
20 | 20 | import org.grails.datastore.gorm.events.ConfigurableApplicationContextEventPublisher;
|
21 | 21 | import org.grails.datastore.gorm.events.ConfigurableApplicationEventPublisher;
|
22 | 22 | import org.grails.datastore.mapping.dirty.checking.DirtyCheckable;
|
23 |
| -import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent; |
24 | 23 | import org.grails.datastore.mapping.engine.ModificationTrackingEntityAccess;
|
| 24 | +import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent; |
25 | 25 | import org.grails.datastore.mapping.model.MappingContext;
|
26 | 26 | import org.grails.datastore.mapping.model.PersistentEntity;
|
27 |
| -import org.grails.datastore.mapping.model.types.Association; |
28 | 27 | import org.grails.datastore.mapping.model.types.Embedded;
|
29 | 28 | import org.grails.datastore.mapping.proxy.ProxyHandler;
|
30 | 29 | import org.grails.orm.hibernate.AbstractHibernateDatastore;
|
31 | 30 | import org.grails.orm.hibernate.AbstractHibernateGormInstanceApi;
|
32 | 31 | import org.hibernate.Hibernate;
|
33 | 32 | import org.hibernate.HibernateException;
|
34 |
| -import org.hibernate.engine.internal.Nullability; |
35 |
| -import org.hibernate.event.service.spi.EventListenerRegistry; |
36 |
| -import org.hibernate.event.spi.*; |
| 33 | +import org.hibernate.event.spi.AbstractEvent; |
| 34 | +import org.hibernate.event.spi.PostDeleteEvent; |
| 35 | +import org.hibernate.event.spi.PostInsertEvent; |
| 36 | +import org.hibernate.event.spi.PostLoadEvent; |
| 37 | +import org.hibernate.event.spi.PostUpdateEvent; |
| 38 | +import org.hibernate.event.spi.PreDeleteEvent; |
| 39 | +import org.hibernate.event.spi.PreInsertEvent; |
| 40 | +import org.hibernate.event.spi.PreLoadEvent; |
| 41 | +import org.hibernate.event.spi.PreUpdateEvent; |
| 42 | +import org.hibernate.event.spi.SaveOrUpdateEvent; |
37 | 43 | import org.hibernate.persister.entity.EntityPersister;
|
38 | 44 | import org.hibernate.tuple.entity.EntityMetamodel;
|
39 | 45 | import org.springframework.beans.BeansException;
|
40 | 46 | import org.springframework.context.ApplicationContext;
|
41 | 47 | import org.springframework.context.ConfigurableApplicationContext;
|
42 | 48 |
|
43 |
| -import java.util.Iterator; |
44 | 49 | import java.util.Map;
|
45 |
| -import java.util.Set; |
46 | 50 |
|
47 | 51 | /**
|
48 | 52 | * Listens for Hibernate events and publishes corresponding Datastore events.
|
@@ -182,14 +186,31 @@ private void synchronizeHibernateState(PreInsertEvent hibernateEvent, Modificati
|
182 | 186 | }
|
183 | 187 |
|
184 | 188 | private void synchronizeHibernateState(PreUpdateEvent hibernateEvent, ModificationTrackingEntityAccess entityAccess) {
|
185 |
| - Map<String, Object> modifiedProperties = entityAccess.getModifiedProperties(); |
186 |
| - if(!modifiedProperties.isEmpty()) { |
| 189 | + Map<String, Object> modifiedProperties = getModifiedPropertiesWithAutotimestamp(hibernateEvent, entityAccess); |
| 190 | + |
| 191 | + if (!modifiedProperties.isEmpty()) { |
187 | 192 | Object[] state = hibernateEvent.getState();
|
188 | 193 | EntityPersister persister = hibernateEvent.getPersister();
|
189 | 194 | synchronizeHibernateState(persister, state, modifiedProperties);
|
190 | 195 | }
|
191 | 196 | }
|
192 | 197 |
|
| 198 | + private Map<String, Object> getModifiedPropertiesWithAutotimestamp(PreUpdateEvent hibernateEvent, ModificationTrackingEntityAccess entityAccess) { |
| 199 | + Map<String, Object> modifiedProperties = entityAccess.getModifiedProperties(); |
| 200 | + |
| 201 | + EntityMetamodel entityMetamodel = hibernateEvent.getPersister().getEntityMetamodel(); |
| 202 | + Integer dateCreatedIdx = entityMetamodel.getPropertyIndexOrNull(AutoTimestampEventListener.DATE_CREATED_PROPERTY); |
| 203 | + |
| 204 | + Object[] oldState = hibernateEvent.getOldState(); |
| 205 | + Object[] state = hibernateEvent.getState(); |
| 206 | + // Only for "dateCreated" property, "lastUpdated" is handled correctly |
| 207 | + if (dateCreatedIdx != null && oldState[dateCreatedIdx] != null && !oldState[dateCreatedIdx].equals(state[dateCreatedIdx])) { |
| 208 | + modifiedProperties.put(AutoTimestampEventListener.DATE_CREATED_PROPERTY, oldState[dateCreatedIdx]); |
| 209 | + } |
| 210 | + |
| 211 | + return modifiedProperties; |
| 212 | + } |
| 213 | + |
193 | 214 | private void synchronizeHibernateState(EntityPersister persister, Object[] state, Map<String, Object> modifiedProperties) {
|
194 | 215 | EntityMetamodel entityMetamodel = persister.getEntityMetamodel();
|
195 | 216 | for(Map.Entry<String,Object> entry : modifiedProperties.entrySet()) {
|
|
0 commit comments