1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package ch.elca.el4j.services.persistence.jpa.dao.extentstrategies;
18
19 import java.util.Collection;
20
21 import org.apache.commons.collections.map.ReferenceMap;
22 import org.hibernate.Hibernate;
23 import org.hibernate.proxy.HibernateProxy;
24 import org.springframework.dao.DataAccessException;
25
26 import ch.elca.el4j.services.persistence.hibernate.dao.extent.ExtentCollection;
27 import ch.elca.el4j.services.persistence.hibernate.dao.extent.ExtentEntity;
28
29
30
31
32
33
34
35
36 public class HibernateExtentFetcher implements ExtentFetcher {
37
38
39 public void fetchExtentObject(Object object, ExtentEntity entity, ReferenceMap fetchedObjects)
40 throws DataAccessException {
41
42 Object[] nullArg = null;
43 if (object == null || entity == null || fetchedObjects == null) {
44 return;
45 }
46 fetchedObjects.put(object, entity);
47 try {
48 for (ExtentEntity ent : entity.getChildEntities()) {
49 Object obj = ent.getMethod().invoke(object, nullArg);
50
51 if (obj instanceof HibernateProxy && !Hibernate.isInitialized(obj)) {
52 Hibernate.initialize(obj);
53 }
54 if (!fetchedObjects.containsKey(obj) || !fetchedObjects.get(obj).equals(ent)) {
55 fetchExtentObject(obj, ent, fetchedObjects);
56 }
57 }
58
59
60 for (ExtentCollection c : entity.getCollections()) {
61 Collection<?> coll = (Collection<?>) c.getMethod().invoke(object, nullArg);
62 if (coll != null) {
63 for (Object o : coll) {
64
65 if (o instanceof HibernateProxy && !Hibernate.isInitialized(o)) {
66 Hibernate.initialize(o);
67 }
68 if (!fetchedObjects.containsKey(o) || !fetchedObjects.get(o).equals(c.getContainedEntity())) {
69 fetchExtentObject(o, c.getContainedEntity(), fetchedObjects);
70 }
71 }
72 }
73 }
74 } catch (Exception e) {
75 throw new RuntimeException(e);
76 }
77
78 }
79
80 }