Set transient id for root merge object
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / hibernate / PostMergeEntityListener.java
1 // $Id$
2 /**
3 * Copyright (C) 2015 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.cdm.persistence.hibernate;
11
12 import java.util.Map;
13
14 import org.hibernate.Hibernate;
15 import org.hibernate.HibernateException;
16 import org.hibernate.event.spi.MergeEvent;
17 import org.hibernate.event.spi.MergeEventListener;
18
19 import eu.etaxonomy.cdm.model.common.CdmBase;
20
21 /**
22 * @author cmathew
23 * @date 23 Sep 2015
24 *
25 */
26 public class PostMergeEntityListener implements MergeEventListener {
27
28
29
30 /* (non-Javadoc)
31 * @see org.hibernate.event.spi.MergeEventListener#onMerge(org.hibernate.event.spi.MergeEvent)
32 */
33 @Override
34 public void onMerge(MergeEvent event) throws HibernateException {
35
36 }
37
38 /* (non-Javadoc)
39 * @see org.hibernate.event.spi.MergeEventListener#onMerge(org.hibernate.event.spi.MergeEvent, java.util.Map)
40 */
41 @Override
42 public void onMerge(MergeEvent event, Map copiedAlready) throws HibernateException {
43 // at this point the original entity to merge has already been copied to the result
44 // => the result is an exact copy of the original EXCEPT or the the id which is set by hibernate
45 // the following code sets the id in the original entity so that it can be used as a return value
46 // for the CdmEntityDaoBase.merge(T transientObject, boolean returnTransientEntity) call
47 if(event.getOriginal() != null && CdmBase.class.isAssignableFrom(event.getOriginal().getClass()) &&
48 event.getResult() != null && CdmBase.class.isAssignableFrom(event.getResult().getClass())) {
49 CdmBase original = (CdmBase) event.getOriginal();
50 CdmBase result = (CdmBase) event.getResult();
51 if(original != null && Hibernate.isInitialized(original) && original.getId() == 0 &&
52 result != null && Hibernate.isInitialized(result)) {
53 original.setId(result.getId());
54
55 }
56 }
57 }
58
59 }