1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package br.com.arsmachina.dao.hibernate;
16
17 import java.io.Serializable;
18 import java.lang.reflect.ParameterizedType;
19 import java.lang.reflect.Type;
20
21 import org.hibernate.SessionFactory;
22 import org.hibernate.classic.Session;
23 import org.hibernate.metadata.ClassMetadata;
24
25
26
27
28
29
30
31
32 public class BaseHibernateDAO<T, K extends Serializable> {
33
34 private final SessionFactory sessionFactory;
35
36 private final Class<T> entityClass;
37
38 private final ClassMetadata classMetadata;
39
40 private final String primaryKeyPropertyName;
41
42
43
44
45
46
47
48 @SuppressWarnings("unchecked")
49 public BaseHibernateDAO(SessionFactory sessionFactory) {
50 this(null, sessionFactory);
51 }
52
53
54
55
56
57
58
59 @SuppressWarnings("unchecked")
60 public BaseHibernateDAO(Class<T> clasz, SessionFactory sessionFactory) {
61
62 if (sessionFactory == null) {
63 throw new IllegalArgumentException("Parameter sessionFactory cannot be null");
64 }
65
66 this.sessionFactory = sessionFactory;
67
68 entityClass = clasz != null ? clasz : extractEntityClassFromHierarchy();
69 classMetadata = sessionFactory.getClassMetadata(getEntityClass());
70
71 if (getClassMetadata() == null) {
72 throw new RuntimeException("Class " + getEntityClass().getName() + " is not mapped");
73 }
74
75 primaryKeyPropertyName = getClassMetadata().getIdentifierPropertyName();
76
77 assert getEntityClass() != null;
78 assert getClassMetadata() != null;
79 assert getPrimaryKeyPropertyName() != null;
80
81 }
82
83
84
85
86 @SuppressWarnings("unchecked")
87 private Class<T> extractEntityClassFromHierarchy() {
88
89 final Type genericSuperclass = getClass().getGenericSuperclass();
90 final ParameterizedType parameterizedType = ((ParameterizedType) genericSuperclass);
91 return (Class<T>) parameterizedType.getActualTypeArguments()[0];
92
93 }
94
95
96
97
98
99
100 protected final Class<T> getEntityClass() {
101 return entityClass;
102 }
103
104
105
106
107
108
109
110 protected Session getSession() {
111 return getSessionFactory().getCurrentSession();
112 }
113
114
115
116
117
118
119 protected final SessionFactory getSessionFactory() {
120 return sessionFactory;
121 }
122
123
124
125
126
127
128 protected final ClassMetadata getClassMetadata() {
129 return classMetadata;
130 }
131
132
133
134
135
136
137 protected String getPrimaryKeyPropertyName() {
138 return primaryKeyPropertyName;
139 }
140
141 }