001 package com.khubla.pragmatach.plugin.hibernate; 002 003 import java.io.Serializable; 004 import java.util.List; 005 import java.util.Set; 006 007 import javax.persistence.Entity; 008 009 import org.hibernate.Criteria; 010 import org.hibernate.Session; 011 import org.hibernate.SessionFactory; 012 import org.hibernate.Transaction; 013 import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 014 import org.hibernate.cfg.Configuration; 015 import org.hibernate.criterion.Projections; 016 import org.hibernate.service.ServiceRegistry; 017 018 import com.khubla.pragmatach.framework.api.PragmatachException; 019 import com.khubla.pragmatach.framework.application.Application; 020 import com.khubla.pragmatach.framework.dao.AbstractDAO; 021 import com.khubla.pragmatach.framework.scanner.AnnotationScanner; 022 023 /** 024 * @author tome 025 */ 026 public class HibernateDAO<T, I extends Serializable> extends AbstractDAO<T, I> { 027 public static SessionFactory getSessionFactory() { 028 return sessionFactory; 029 } 030 031 /** 032 * the type 033 */ 034 private final Class<T> typeClazz; 035 /** 036 * the identifier 037 */ 038 private final Class<I> identifierClazz; 039 /** 040 * the Hibernate session factory 041 */ 042 private static SessionFactory sessionFactory = buildSessionFactory(); 043 /** 044 * the Hibernate service registry 045 */ 046 private static ServiceRegistry serviceRegistry; 047 048 private static SessionFactory buildSessionFactory() { 049 try { 050 /* 051 * make config 052 */ 053 final Configuration configuration = new Configuration(); 054 final String dataSource = Application.getConfiguration().getParameter("hibernate.connection.datasource"); 055 if ((null != dataSource) && (dataSource.length() > 0)) { 056 configuration.setProperty("connection.datasource", dataSource); 057 } else { 058 /* 059 * configure via driver 060 */ 061 configuration.setProperty("hibernate.driver", Application.getConfiguration().getParameter("hibernate.driver")); 062 configuration.setProperty("hibernate.connection.url", Application.getConfiguration().getParameter("hibernate.connection.url")); 063 final String username = Application.getConfiguration().getParameter("hibernate.connection.username"); 064 if (username != null) { 065 configuration.setProperty("hibernate.connection.username", username); 066 } 067 final String password = Application.getConfiguration().getParameter("hibernate.connection.password"); 068 if (password != null) { 069 configuration.setProperty("hibernate.connection.password", password); 070 } 071 } 072 /* 073 * dialect 074 */ 075 configuration.setProperty("hibernate.dialect", Application.getConfiguration().getParameter("hibernate.dialect")); 076 /* 077 * generate DDL? 078 */ 079 final String autoFlag = Application.getConfiguration().getParameter("hibernate.hbm2ddl.auto"); 080 if (null != autoFlag) { 081 configuration.setProperty("hibernate.hbm2ddl.auto", autoFlag); 082 } 083 /* 084 * add classes 085 */ 086 final Set<Class<?>> entityClasses = getEntityClasses(); 087 if (null != entityClasses) { 088 for (final Class<?> clazz : entityClasses) { 089 configuration.addAnnotatedClass(clazz); 090 } 091 } 092 /* 093 * go for it 094 */ 095 serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); 096 return configuration.buildSessionFactory(serviceRegistry); 097 } catch (final Exception e) { 098 throw new ExceptionInInitializerError(e); 099 } 100 } 101 102 /** 103 * the annotation scanner will have run; we can just query for annotated classes 104 */ 105 protected static Set<Class<?>> getEntityClasses() throws PragmatachException { 106 try { 107 return AnnotationScanner.getAllClasses(Entity.class); 108 } catch (final Exception e) { 109 throw new PragmatachException("Exception in getAnnotatedClasses", e); 110 } 111 } 112 113 public HibernateDAO(Class<T> typeClazz, Class<I> identifierClazz) { 114 this.typeClazz = typeClazz; 115 this.identifierClazz = identifierClazz; 116 } 117 118 @Override 119 public long count() throws PragmatachException { 120 return (Long) this.find().setProjection(Projections.rowCount()).uniqueResult(); 121 } 122 123 /** 124 * delete 125 */ 126 public void delete(T t) throws PragmatachException { 127 Session session = null; 128 Transaction transaction = null; 129 try { 130 session = getSessionFactory().openSession(); 131 transaction = session.beginTransaction(); 132 session.delete(t); 133 transaction.commit(); 134 } catch (final Exception e) { 135 if (null != transaction) { 136 transaction.rollback(); 137 } 138 throw new PragmatachException("Exception in delete", e); 139 } finally { 140 if (null != session) { 141 session.close(); 142 } 143 } 144 } 145 146 /** 147 * delete 148 */ 149 @SuppressWarnings("unchecked") 150 public void deletebyId(I i) throws PragmatachException { 151 Session session = null; 152 Transaction transaction = null; 153 try { 154 session = getSessionFactory().openSession(); 155 transaction = session.beginTransaction(); 156 final T t = (T) session.get(typeClazz, i); 157 if (null != t) { 158 session.delete(t); 159 } 160 transaction.commit(); 161 } catch (final Exception e) { 162 if (null != transaction) { 163 transaction.rollback(); 164 } 165 throw new PragmatachException("Exception in deletebyId", e); 166 } finally { 167 if (null != session) { 168 session.close(); 169 } 170 } 171 } 172 173 /** 174 * find by fluent query. note that this leaves a session open! 175 */ 176 public Criteria find() throws PragmatachException { 177 Session session = null; 178 try { 179 session = getSessionFactory().openSession(); 180 return session.createCriteria(this.typeClazz); 181 } catch (final Exception e) { 182 throw new PragmatachException("Exception in find", e); 183 } 184 } 185 186 /** 187 * find by id 188 */ 189 @SuppressWarnings("unchecked") 190 public T findById(I i) throws PragmatachException { 191 Session session = null; 192 try { 193 session = getSessionFactory().openSession(); 194 return (T) session.get(typeClazz, i); 195 } catch (final Exception e) { 196 throw new PragmatachException("Exception in findById", e); 197 } finally { 198 if (null != session) { 199 session.close(); 200 } 201 } 202 } 203 204 /** 205 * findall 206 */ 207 @SuppressWarnings("unchecked") 208 public List<T> getAll() throws PragmatachException { 209 Session session = null; 210 try { 211 session = getSessionFactory().openSession(); 212 final Criteria criteria = session.createCriteria(this.typeClazz); 213 return criteria.list(); 214 } catch (final Exception e) { 215 throw new PragmatachException("Exception in findAll", e); 216 } finally { 217 if (null != session) { 218 session.close(); 219 } 220 } 221 } 222 223 @SuppressWarnings("unchecked") 224 @Override 225 public List<T> getAll(int start, int count) throws PragmatachException { 226 Session session = null; 227 try { 228 session = getSessionFactory().openSession(); 229 final Criteria criteria = session.createCriteria(this.typeClazz); 230 criteria.setFirstResult(start); 231 criteria.setMaxResults(count); 232 return criteria.list(); 233 } catch (final Exception e) { 234 throw new PragmatachException("Exception in findAll", e); 235 } finally { 236 if (null != session) { 237 session.close(); 238 } 239 } 240 } 241 242 public Class<I> getIdentifierClazz() { 243 return identifierClazz; 244 } 245 246 public Class<T> getTypeClazz() { 247 return typeClazz; 248 } 249 250 public void reloadConfig() { 251 sessionFactory = buildSessionFactory(); 252 } 253 254 /** 255 * save object 256 */ 257 public void save(T t) throws PragmatachException { 258 Session session = null; 259 Transaction transaction = null; 260 try { 261 session = getSessionFactory().openSession(); 262 transaction = session.beginTransaction(); 263 session.save(t); 264 transaction.commit(); 265 } catch (final Exception e) { 266 if (null != transaction) { 267 transaction.rollback(); 268 } 269 throw new PragmatachException("Exception in save", e); 270 } finally { 271 if (null != session) { 272 session.close(); 273 } 274 } 275 } 276 277 /** 278 * update object 279 */ 280 public void update(T t) throws PragmatachException { 281 Session session = null; 282 Transaction transaction = null; 283 try { 284 session = getSessionFactory().openSession(); 285 transaction = session.beginTransaction(); 286 session.update(t); 287 transaction.commit(); 288 } catch (final Exception e) { 289 if (null != transaction) { 290 transaction.rollback(); 291 } 292 throw new PragmatachException("Exception in update", e); 293 } finally { 294 if (null != session) { 295 session.close(); 296 } 297 } 298 } 299 }