KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > springframework > orm > hibernate3 > support > IdTransferringMergeEventListener


1 /*
2  * Copyright 2002-2005 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16
17 package org.springframework.orm.hibernate3.support;
18
19 import java.io.Serializable JavaDoc;
20 import java.util.Map JavaDoc;
21
22 import org.hibernate.engine.SessionImplementor;
23 import org.hibernate.event.MergeEvent;
24 import org.hibernate.event.def.DefaultMergeEventListener;
25 import org.hibernate.persister.entity.EntityPersister;
26
27 /**
28  * Extension of Hibernate's DefaultMergeEventListener, transferring the ids
29  * of newly saved objects to the corresponding original objects (that are part
30  * of the detached object graph passed into the <code>merge</code> method).
31  *
32  * <p>Transferring newly assigned ids to the original graph allows for continuing
33  * to use the original object graph, despite merged copies being registered with
34  * the current Hibernate Session. This is particularly useful for web applications
35  * that might want to store an object graph and then render it in a web view,
36  * with links that include the id of certain (potentially newly saved) objects.
37  *
38  * <p>The merge behavior given by this MergeEventListener is nearly identical
39  * to TopLink's merge behavior. See PetClinic for an example, which relies on
40  * ids being available for newly saved objects: the <code>HibernateClinic</code>
41  * and <code>TopLinkClinic</code> DAO implementations both use straight merge
42  * calls, with the Hibernate SessionFactory configuration specifying an
43  * <code>IdTransferringMergeEventListener</code>.
44  *
45  * <p>Typically specified as entry for LocalSessionFactoryBean's "eventListeners"
46  * map, with key "merge".
47  *
48  * <p><b>NOTE:</b> Due to incompatible changes in the Hibernate 3.1 event listener
49  * API, this merge event listener will only work as-is with Hibernate 3.1+. Consider
50  * copying this implementation and adapting it to the older API if you want to run
51  * it against Hibernate 3.0.
52  *
53  * @author Juergen Hoeller
54  * @since 1.2
55  * @see org.springframework.orm.hibernate3.LocalSessionFactoryBean#setEventListeners(java.util.Map)
56  */

57 public class IdTransferringMergeEventListener extends DefaultMergeEventListener {
58
59     /**
60      * Hibernate 3.1 implementation of ID transferral.
61      * Comment this out and the below in for a Hibernate 3.0 version of this class.
62      */

63     protected void entityIsTransient(MergeEvent event, Map JavaDoc copyCache) {
64         super.entityIsTransient(event, copyCache);
65         SessionImplementor session = event.getSession();
66         EntityPersister persister = session.getEntityPersister(event.getEntityName(), event.getEntity());
67         // Extract id from merged copy (which is currently registered with Session).
68
Serializable JavaDoc id = persister.getIdentifier(event.getResult(), session.getEntityMode());
69         // Set id on original object (which remains detached).
70
persister.setIdentifier(event.getOriginal(), id, session.getEntityMode());
71     }
72
73     /**
74      * Hibernate 3.0 implementation of ID transferral.
75      * Comment this in and the above out for a Hibernate 3.0 version of this class.
76      */

77     /*
78     protected Object entityIsTransient(MergeEvent event, Map copyCache) {
79         Object mergedCopy = super.entityIsTransient(event, copyCache);
80         SessionImplementor session = event.getSession();
81         EntityPersister persister = session.getEntityPersister(event.getEntityName(), event.getEntity());
82         // Extract id from merged copy (which is currently registered with Session).
83         Serializable id = persister.getIdentifier(mergedCopy, session.getEntityMode());
84         // Set id on original object (which remains detached).
85         persister.setIdentifier(event.getOriginal(), id, session.getEntityMode());
86         return mergedCopy;
87     }
88     */

89
90 }
91
Popular Tags