import org.hibernate.metadata.ClassMetadata;\r
import org.hibernate.search.FullTextQuery;\r
import org.hibernate.type.Type;\r
-import org.joda.time.DateTime;\r
import org.springframework.beans.factory.annotation.Autowired;\r
import org.springframework.dao.DataAccessException;\r
import org.springframework.dao.InvalidDataAccessApiUsageException;\r
-import org.springframework.security.core.Authentication;\r
-import org.springframework.security.core.context.SecurityContextHolder;\r
import org.springframework.stereotype.Repository;\r
import org.springframework.util.ReflectionUtils;\r
\r
import eu.etaxonomy.cdm.config.Configuration;\r
import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.common.User;\r
-import eu.etaxonomy.cdm.model.common.VersionableEntity;\r
import eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao;\r
import eu.etaxonomy.cdm.persistence.dao.initializer.IBeanInitializer;\r
import eu.etaxonomy.cdm.persistence.hibernate.replace.ReferringObjectMetadata;\r
if (logger.isDebugEnabled()){logger.debug("dao clear end");}\r
}\r
\r
+ @Override\r
+ public T merge(T transientObject, boolean returnTransientEntity) throws DataAccessException {\r
+ T persistentObject = merge(transientObject);\r
+ if(returnTransientEntity) {\r
+ if(transientObject != null && persistentObject != null) {\r
+ transientObject.setId(persistentObject.getId());\r
+ }\r
+ return transientObject;\r
+ } else {\r
+ return persistentObject;\r
+ }\r
+ }\r
+ \r
@Override\r
public T merge(T transientObject) throws DataAccessException {\r
+ if(transientObject == null) {\r
+ return null;\r
+ }\r
Session session = getSession();\r
@SuppressWarnings("unchecked")\r
T persistentObject = (T)session.merge(transientObject);\r
if (logger.isDebugEnabled()){logger.debug("dao saveOrUpdate start...");}\r
if (logger.isDebugEnabled()){logger.debug("transientObject(" + transientObject.getClass().getSimpleName() + ") ID:" + transientObject.getId() + ", UUID: " + transientObject.getUuid()) ;}\r
Session session = getSession();\r
- if(transientObject.getId() != 0 && VersionableEntity.class.isAssignableFrom(transientObject.getClass())) {\r
- VersionableEntity versionableEntity = (VersionableEntity)transientObject;\r
- versionableEntity.setUpdated(new DateTime());\r
- Authentication authentication = SecurityContextHolder.getContext().getAuthentication();\r
- if(authentication != null && authentication.getPrincipal() != null && authentication.getPrincipal() instanceof User) {\r
- User user = (User)authentication.getPrincipal();\r
- versionableEntity.setUpdatedBy(user);\r
- }\r
- }\r
session.saveOrUpdate(transientObject);\r
if (logger.isDebugEnabled()){logger.debug("dao saveOrUpdate end");}\r
return transientObject.getUuid();\r
// I think this is preferable to catching lazy initialization errors\r
// as that solution only swallows and hides the exception, but doesn't\r
// actually solve it.\r
- persistentObject = (T) getSession().merge(persistentObject);\r
+ persistentObject = (T) getSession().merge(persistentObject);\r
getSession().delete(persistentObject);\r
return persistentObject.getUuid();\r
}\r
\r
// prepend to register before or append to register after\r
// this example will register a persist event listener\r
- eventRegistry.prependListeners(EventType.SAVE, new CacheStrategyGenerator(), new SaveEntityListener());\r
+ //eventRegistry.prependListeners(EventType.SAVE, new CacheStrategyGenerator(), new SaveEntityListener());\r
eventRegistry.prependListeners(EventType.UPDATE, new CacheStrategyGenerator(), new UpdateEntityListener());\r
- eventRegistry.prependListeners(EventType.SAVE_UPDATE, new CacheStrategyGenerator(), new SaveOrUpdateEntityListener());\r
++
+ eventRegistry.prependListeners(EventType.SAVE_UPDATE, new CacheStrategyGenerator(), new SaveOrUpdateorMergeEntityListener());\r
+ eventRegistry.prependListeners(EventType.MERGE, new CacheStrategyGenerator(), new SaveOrUpdateorMergeEntityListener());\r
++
++// eventRegistry.prependListeners(EventType.SAVE_UPDATE, new CacheStrategyGenerator(), new SaveOrUpdateEntityListener());\r
++ //TODO Cherian move to SaveOrUpdateorMergeEntityListener\r
+ eventRegistry.appendListeners(EventType.MERGE, new PostMergeEntityListener());\r
++
eventRegistry.appendListeners(EventType.DELETE, new CdmDeleteListener());\r
eventRegistry.appendListeners(EventType.POST_LOAD, new CdmPostDataChangeObservableListener());\r
//with validation\r
eventRegistry.appendListeners(EventType.POST_INSERT, new CdmPostDataChangeObservableListener());\r
eventRegistry.appendListeners(EventType.POST_UPDATE, new CdmPostDataChangeObservableListener());\r
eventRegistry.appendListeners(EventType.POST_DELETE, new CdmPostDataChangeObservableListener());\r
+\r
+ eventRegistry.appendListeners(EventType.PRE_INSERT, new CdmPreDataChangeObservableListener());\r
+ eventRegistry.appendListeners(EventType.PRE_UPDATE, new CdmPreDataChangeObservableListener());\r
}\r
\r
\r
--- /dev/null
-
- /* (non-Javadoc)
- * @see org.hibernate.event.spi.MergeEventListener#onMerge(org.hibernate.event.spi.MergeEvent)
- */
+ // $Id$
+ /**
+ * Copyright (C) 2015 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
+ package eu.etaxonomy.cdm.persistence.hibernate;
+
+ import java.util.Map;
+
+ import org.hibernate.Hibernate;
+ import org.hibernate.HibernateException;
+ import org.hibernate.event.spi.MergeEvent;
+ import org.hibernate.event.spi.MergeEventListener;
+
+ import eu.etaxonomy.cdm.model.common.CdmBase;
+
+ /**
+ * @author cmathew
+ * @date 23 Sep 2015
+ *
+ */
+ public class PostMergeEntityListener implements MergeEventListener {
+
++ private static final long serialVersionUID = 1565797119368313987L;
+
- /* (non-Javadoc)
- * @see org.hibernate.event.spi.MergeEventListener#onMerge(org.hibernate.event.spi.MergeEvent, java.util.Map)
- */
+ @Override
+ public void onMerge(MergeEvent event) throws HibernateException {
+
+ }
+
+ @Override
+ public void onMerge(MergeEvent event, Map copiedAlready) throws HibernateException {
+ // at this point the original entity to merge has already been copied to the result
+ // => the result is an exact copy of the original EXCEPT or the the id which is set by hibernate
+ // the following code sets the id in the original entity so that it can be used as a return value
+ // for the CdmEntityDaoBase.merge(T transientObject, boolean returnTransientEntity) call
+ if(event.getOriginal() != null && CdmBase.class.isAssignableFrom(event.getOriginal().getClass()) &&
+ event.getResult() != null && CdmBase.class.isAssignableFrom(event.getResult().getClass())) {
+ CdmBase original = (CdmBase) event.getOriginal();
+ CdmBase result = (CdmBase) event.getResult();
+ if(original != null && Hibernate.isInitialized(original) && original.getId() == 0 &&
+ result != null && Hibernate.isInitialized(result)) {
+ original.setId(result.getId());
+
+ }
+ }
+ }
+
+ }