Revision e8719569
Added by Cherian Mathew over 8 years ago
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/hibernate/CdmListenerIntegrator.java | ||
---|---|---|
49 | 49 |
// this example will register a persist event listener |
50 | 50 |
eventRegistry.prependListeners(EventType.SAVE, new CacheStrategyGenerator(), new SaveEntityListener()); |
51 | 51 |
eventRegistry.prependListeners(EventType.UPDATE, new CacheStrategyGenerator(), new UpdateEntityListener()); |
52 |
|
|
53 |
eventRegistry.prependListeners(EventType.SAVE_UPDATE, new CacheStrategyGenerator(), new SaveOrUpdateorMergeEntityListener()); |
|
54 |
eventRegistry.prependListeners(EventType.MERGE, new CacheStrategyGenerator(), new SaveOrUpdateorMergeEntityListener()); |
|
55 |
|
|
56 |
// eventRegistry.prependListeners(EventType.SAVE_UPDATE, new CacheStrategyGenerator(), new SaveOrUpdateEntityListener()); |
|
57 |
//TODO Cherian move to SaveOrUpdateorMergeEntityListener |
|
52 |
eventRegistry.prependListeners(EventType.SAVE_UPDATE, new CacheStrategyGenerator(), new SaveOrUpdateEntityListener()); |
|
58 | 53 |
eventRegistry.appendListeners(EventType.MERGE, new PostMergeEntityListener()); |
59 |
|
|
60 | 54 |
eventRegistry.appendListeners(EventType.DELETE, new CdmDeleteListener()); |
61 | 55 |
eventRegistry.appendListeners(EventType.POST_LOAD, new CdmPostDataChangeObservableListener()); |
62 | 56 |
//with validation |
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/hibernate/SaveOrUpdateEntityListener.java | ||
---|---|---|
1 |
// $Id$ |
|
2 |
/** |
|
3 |
* Copyright (C) 2007 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.List; |
|
13 |
|
|
14 |
import org.hibernate.HibernateException; |
|
15 |
import org.hibernate.Session; |
|
16 |
import org.hibernate.event.spi.SaveOrUpdateEvent; |
|
17 |
import org.hibernate.event.spi.SaveOrUpdateEventListener; |
|
18 |
|
|
19 |
import eu.etaxonomy.cdm.model.common.CdmBase; |
|
20 |
import eu.etaxonomy.cdm.model.common.ITreeNode; |
|
21 |
|
|
22 |
|
|
23 |
@SuppressWarnings("serial") |
|
24 |
public class SaveOrUpdateEntityListener implements SaveOrUpdateEventListener{ |
|
25 |
|
|
26 |
@Override |
|
27 |
public void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException { |
|
28 |
//System.err.println("SaveOrUpdateListener" + event.getEntity().getClass()); |
|
29 |
Object entity = event.getObject(); |
|
30 |
saveOrUpdate(entity, event.getSession()); |
|
31 |
} |
|
32 |
|
|
33 |
|
|
34 |
private void saveOrUpdate(Object entity, Session session) { |
|
35 |
|
|
36 |
//moved to CdmPreDataChangeListener |
|
37 |
if(entity != null && CdmBase.class.isAssignableFrom(entity.getClass())){ |
|
38 |
if (entity instanceof ITreeNode) { |
|
39 |
ITreeNode<?> node = (ITreeNode<?>)entity; |
|
40 |
reindex(node); |
|
41 |
|
|
42 |
} |
|
43 |
} |
|
44 |
} |
|
45 |
|
|
46 |
static String sep = ITreeNode.separator; |
|
47 |
static String pref = ITreeNode.treePrefix; |
|
48 |
|
|
49 |
/** |
|
50 |
* @param event |
|
51 |
* @param node |
|
52 |
*/ |
|
53 |
private <T extends ITreeNode> void reindex(T node) { |
|
54 |
String oldChildIndex = node.treeIndex(); |
|
55 |
ITreeNode<?> parent = node.getParent(); |
|
56 |
String parentIndex = (parent == null) ? (sep + pref + node.treeId() + sep) : parent.treeIndex(); //TODO |
|
57 |
if (node.getId() > 0){ //TODO |
|
58 |
String newChildIndex = parentIndex + node.getId() + sep; |
|
59 |
if (oldChildIndex == null || ! oldChildIndex.equals(newChildIndex)){ |
|
60 |
node.setTreeIndex(newChildIndex); |
|
61 |
|
|
62 |
//TODO this is a greedy implementation, better use update by replace string |
|
63 |
//either using and improving the below code or by using native SQL |
|
64 |
//The current approach may run out of memory for large descendant sets. |
|
65 |
List<T> childNodes = node.getChildNodes(); |
|
66 |
for (T child : childNodes){ |
|
67 |
if (child != null && ! child.equals(node)){ //node should not be it's own child, however just in case |
|
68 |
reindex(child); |
|
69 |
} |
|
70 |
} |
|
71 |
|
|
72 |
// String className = event.getEntityName(); |
|
73 |
// String updateQuery = " UPDATE %s tn " + |
|
74 |
// " SET tn.treeIndex = Replace(tn.treeIndex, '%s', '%s') " + |
|
75 |
// " WHERE tn.id <> "+ node.getId()+" "; |
|
76 |
// updateQuery = String.format(updateQuery, className, oldChildIndex, parentIndex); //dummy |
|
77 |
// System.out.println(updateQuery); |
|
78 |
// EventSource session = event.getSession(); |
|
79 |
// Query query = session.createQuery(updateQuery); |
|
80 |
// query.executeUpdate(); |
|
81 |
} |
|
82 |
} |
|
83 |
} |
|
84 |
|
|
85 |
|
|
86 |
|
|
87 |
} |
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/hibernate/SaveOrUpdateorMergeEntityListener.java | ||
---|---|---|
1 |
// $Id$ |
|
2 |
/** |
|
3 |
* Copyright (C) 2007 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.List; |
|
13 |
import java.util.Map; |
|
14 |
|
|
15 |
import org.hibernate.HibernateException; |
|
16 |
import org.hibernate.Session; |
|
17 |
import org.hibernate.event.spi.MergeEvent; |
|
18 |
import org.hibernate.event.spi.MergeEventListener; |
|
19 |
import org.hibernate.event.spi.SaveOrUpdateEvent; |
|
20 |
import org.hibernate.event.spi.SaveOrUpdateEventListener; |
|
21 |
|
|
22 |
import eu.etaxonomy.cdm.model.common.CdmBase; |
|
23 |
import eu.etaxonomy.cdm.model.common.ITreeNode; |
|
24 |
|
|
25 |
|
|
26 |
@SuppressWarnings("serial") |
|
27 |
public class SaveOrUpdateorMergeEntityListener implements SaveOrUpdateEventListener, MergeEventListener { |
|
28 |
|
|
29 |
@Override |
|
30 |
public void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException { |
|
31 |
//System.err.println("SaveOrUpdateListener" + event.getEntity().getClass()); |
|
32 |
Object entity = event.getObject(); |
|
33 |
saveOrUpdateOrMerge(entity, event.getSession()); |
|
34 |
} |
|
35 |
|
|
36 |
@Override |
|
37 |
public void onMerge(MergeEvent event) throws HibernateException { |
|
38 |
Object entity = event.getOriginal(); |
|
39 |
saveOrUpdateOrMerge(entity,event.getSession()); |
|
40 |
} |
|
41 |
|
|
42 |
@Override |
|
43 |
public void onMerge(MergeEvent event, Map copiedAlready) throws HibernateException { |
|
44 |
|
|
45 |
} |
|
46 |
|
|
47 |
private void saveOrUpdateOrMerge(Object entity, Session session) { |
|
48 |
|
|
49 |
//moved to CdmPreDataChangeListener |
|
50 |
if(entity != null && CdmBase.class.isAssignableFrom(entity.getClass())){ |
|
51 |
if (entity instanceof ITreeNode) { |
|
52 |
ITreeNode<?> node = (ITreeNode<?>)entity; |
|
53 |
reindex(node); |
|
54 |
|
|
55 |
} |
|
56 |
} |
|
57 |
} |
|
58 |
|
|
59 |
static String sep = ITreeNode.separator; |
|
60 |
static String pref = ITreeNode.treePrefix; |
|
61 |
|
|
62 |
/** |
|
63 |
* @param event |
|
64 |
* @param node |
|
65 |
*/ |
|
66 |
private <T extends ITreeNode> void reindex(T node) { |
|
67 |
String oldChildIndex = node.treeIndex(); |
|
68 |
ITreeNode<?> parent = node.getParent(); |
|
69 |
String parentIndex = (parent == null) ? (sep + pref + node.treeId() + sep) : parent.treeIndex(); //TODO |
|
70 |
if (node.getId() > 0){ //TODO |
|
71 |
String newChildIndex = parentIndex + node.getId() + sep; |
|
72 |
if (oldChildIndex == null || ! oldChildIndex.equals(newChildIndex)){ |
|
73 |
node.setTreeIndex(newChildIndex); |
|
74 |
|
|
75 |
//TODO this is a greedy implementation, better use update by replace string |
|
76 |
//either using and improving the below code or by using native SQL |
|
77 |
//The current approach may run out of memory for large descendant sets. |
|
78 |
List<T> childNodes = node.getChildNodes(); |
|
79 |
for (T child : childNodes){ |
|
80 |
if (child != null && ! child.equals(node)){ //node should not be it's own child, however just in case |
|
81 |
reindex(child); |
|
82 |
} |
|
83 |
} |
|
84 |
|
|
85 |
// String className = event.getEntityName(); |
|
86 |
// String updateQuery = " UPDATE %s tn " + |
|
87 |
// " SET tn.treeIndex = Replace(tn.treeIndex, '%s', '%s') " + |
|
88 |
// " WHERE tn.id <> "+ node.getId()+" "; |
|
89 |
// updateQuery = String.format(updateQuery, className, oldChildIndex, parentIndex); //dummy |
|
90 |
// System.out.println(updateQuery); |
|
91 |
// EventSource session = event.getSession(); |
|
92 |
// Query query = session.createQuery(updateQuery); |
|
93 |
// query.executeUpdate(); |
|
94 |
} |
|
95 |
} |
|
96 |
} |
|
97 |
|
|
98 |
|
|
99 |
|
|
100 |
} |
Also available in: Unified diff
#5066 Remove unnecessary merge listener