*/
package eu.etaxonomy.cdm.persistence.hibernate;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
+import org.hibernate.Session;
import org.hibernate.event.spi.MergeEvent;
import org.hibernate.event.spi.MergeEventListener;
*
*/
public class PostMergeEntityListener implements MergeEventListener {
-
private static final long serialVersionUID = 1565797119368313987L;
+ private static Map<Session, Set<CdmBase>> newEntitiesMap = new ConcurrentHashMap<Session, Set<CdmBase>>();
+
+ public static void addSession(Session session) {
+ newEntitiesMap.put(session, new HashSet<CdmBase>());
+ }
+
+ public static void removeSession(Session session) {
+ newEntitiesMap.remove(session);
+ }
+
+ public static Set<CdmBase> getNewEntities(Session session) {
+ return newEntitiesMap.get(session);
+ }
+
@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
+ // any new entities are added to a map which is retrieved at the end of 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)) {
+ result != null && Hibernate.isInitialized(result) && result.getId() > 0) {
original.setId(result.getId());
-
+ Set<CdmBase> newEntities = newEntitiesMap.get(event.getSession());
+ if(newEntities != null) {
+ newEntities.add(result);
+ }
}
}
+
+
}
}