1
2
3
4
5 package gboat2.base.dao.impl;
6
7 import gboat2.base.dao.aspect.SessionFactoryHolder;
8
9 import java.util.ArrayList;
10 import java.util.Collections;
11 import java.util.List;
12
13 import org.hibernate.HibernateException;
14 import org.hibernate.Session;
15 import org.hibernate.SessionFactory;
16 import org.springframework.dao.DataAccessResourceFailureException;
17 import org.springframework.dao.support.DaoSupport;
18 import org.springframework.orm.hibernate3.HibernateTemplate;
19 import org.springframework.orm.hibernate3.SessionFactoryUtils;
20
21
22
23
24
25
26
27
28
29
30 public class GboatHibernateDaoSupport extends DaoSupport {
31
32 private static List<HibernateTemplate> hibernateTemplates = Collections.synchronizedList(new ArrayList<HibernateTemplate>());
33 private HibernateTemplate defaultHibernateTemplate;
34
35 public void setDefaultSessionFactory(SessionFactory sessionFactory) {
36 if (this.defaultHibernateTemplate == null || sessionFactory != this.defaultHibernateTemplate.getSessionFactory()) {
37 this.defaultHibernateTemplate = createHibernateTemplate(sessionFactory);
38 }
39 }
40
41 public SessionFactory getDefaultSessionFactory() {
42 return getDefaultHibernateTemplate().getSessionFactory();
43 }
44
45
46
47
48 public SessionFactory getSessionFactory() {
49 HibernateTemplate hibernateTemplate = this.getHibernateTemplate();
50 return (hibernateTemplate != null ? hibernateTemplate.getSessionFactory() : null);
51 }
52
53 public void addSessionFactory(SessionFactory sessionFactory) {
54 for (HibernateTemplate template : hibernateTemplates) {
55 if(template.getSessionFactory().equals(sessionFactory))
56 return;
57 }
58
59 HibernateTemplate template = createHibernateTemplate(sessionFactory);
60 hibernateTemplates.add(template);
61 }
62
63 public void setDefaultHibernateTemplate(HibernateTemplate defaultHibernateTemplate) {
64 this.defaultHibernateTemplate = defaultHibernateTemplate;
65 }
66
67 public HibernateTemplate getDefaultHibernateTemplate() {
68 return defaultHibernateTemplate;
69 }
70
71
72
73
74
75
76
77
78
79
80
81 public HibernateTemplate getHibernateTemplate() {
82 SessionFactory sessionFactory = SessionFactoryHolder.getSessionFactory();
83 if(sessionFactory == null)
84 return this.defaultHibernateTemplate;
85
86 for (HibernateTemplate template : hibernateTemplates) {
87 if(template.getSessionFactory().equals(sessionFactory))
88 return template;
89 }
90
91 throw new HibernateException("没有与当前 SessionFactory 相匹配的 HibernateTemplate 实例。");
92 }
93
94
95
96
97
98
99
100
101
102
103 protected HibernateTemplate createHibernateTemplate(SessionFactory sessionFactory) {
104 return new HibernateTemplate(sessionFactory);
105 }
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124 protected Session getSession() throws DataAccessResourceFailureException, IllegalStateException {
125 return getSession(this.getHibernateTemplate().isAllowCreate());
126 }
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147 protected Session getSession(boolean allowCreate) throws DataAccessResourceFailureException, IllegalStateException {
148 HibernateTemplate hibernateTemplate = this.getHibernateTemplate();
149 return (!allowCreate ?
150 SessionFactoryUtils.getSession(getSessionFactory(), false) :
151 SessionFactoryUtils.getSession(
152 getSessionFactory(),
153 hibernateTemplate.getEntityInterceptor(),
154 hibernateTemplate.getJdbcExceptionTranslator()));
155 }
156
157 @Override
158 protected void checkDaoConfig() throws IllegalArgumentException {
159 if (this.defaultHibernateTemplate == null) {
160 throw new IllegalArgumentException("'sessionFactory' or 'hibernateTemplate' is required");
161 }
162 }
163
164 }