Skip to content

Commit 1fba65e

Browse files
authored
Merge pull request #1122 from grails/grails-core-issue-10964
Check for changes in "dateCreated" in PreUpdateEvent to synchronize the Hibernate state
2 parents 01fa330 + f030472 commit 1fba65e

File tree

1 file changed

+31
-10
lines changed

1 file changed

+31
-10
lines changed

grails-datastore-gorm-hibernate-core/src/main/groovy/org/grails/orm/hibernate/support/ClosureEventTriggeringInterceptor.java

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,37 @@
1616
package org.grails.orm.hibernate.support;
1717

1818

19-
import grails.gorm.dirty.checking.DirtyCheck;
19+
import org.grails.datastore.gorm.events.AutoTimestampEventListener;
2020
import org.grails.datastore.gorm.events.ConfigurableApplicationContextEventPublisher;
2121
import org.grails.datastore.gorm.events.ConfigurableApplicationEventPublisher;
2222
import org.grails.datastore.mapping.dirty.checking.DirtyCheckable;
23-
import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent;
2423
import org.grails.datastore.mapping.engine.ModificationTrackingEntityAccess;
24+
import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent;
2525
import org.grails.datastore.mapping.model.MappingContext;
2626
import org.grails.datastore.mapping.model.PersistentEntity;
27-
import org.grails.datastore.mapping.model.types.Association;
2827
import org.grails.datastore.mapping.model.types.Embedded;
2928
import org.grails.datastore.mapping.proxy.ProxyHandler;
3029
import org.grails.orm.hibernate.AbstractHibernateDatastore;
3130
import org.grails.orm.hibernate.AbstractHibernateGormInstanceApi;
3231
import org.hibernate.Hibernate;
3332
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;
3743
import org.hibernate.persister.entity.EntityPersister;
3844
import org.hibernate.tuple.entity.EntityMetamodel;
3945
import org.springframework.beans.BeansException;
4046
import org.springframework.context.ApplicationContext;
4147
import org.springframework.context.ConfigurableApplicationContext;
4248

43-
import java.util.Iterator;
4449
import java.util.Map;
45-
import java.util.Set;
4650

4751
/**
4852
* Listens for Hibernate events and publishes corresponding Datastore events.
@@ -182,14 +186,31 @@ private void synchronizeHibernateState(PreInsertEvent hibernateEvent, Modificati
182186
}
183187

184188
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()) {
187192
Object[] state = hibernateEvent.getState();
188193
EntityPersister persister = hibernateEvent.getPersister();
189194
synchronizeHibernateState(persister, state, modifiedProperties);
190195
}
191196
}
192197

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+
193214
private void synchronizeHibernateState(EntityPersister persister, Object[] state, Map<String, Object> modifiedProperties) {
194215
EntityMetamodel entityMetamodel = persister.getEntityMetamodel();
195216
for(Map.Entry<String,Object> entry : modifiedProperties.entrySet()) {

0 commit comments

Comments
 (0)