1 69 package com.ivata.groupware.container.persistence.hibernate; 70 71 import org.apache.log4j.Logger; 72 73 import java.io.Serializable ; 74 import java.util.Iterator ; 75 import java.util.List ; 76 import java.util.Map ; 77 import java.util.Set ; 78 79 import net.sf.hibernate.HibernateException; 80 import net.sf.hibernate.ObjectNotFoundException; 81 import net.sf.hibernate.Query; 82 import net.sf.hibernate.Session; 83 import net.sf.hibernate.SessionFactory; 84 import net.sf.hibernate.Transaction; 85 86 import com.ivata.groupware.container.persistence.QueryPersistenceManager; 87 import com.ivata.groupware.container.persistence.listener.AddPersistenceListener; 88 import com.ivata.groupware.container.persistence.listener.AmendPersistenceListener; 89 import com.ivata.groupware.container.persistence.listener.RemovePersistenceListener; 90 import com.ivata.mask.persistence.FinderException; 91 import com.ivata.mask.persistence.PersistenceException; 92 import com.ivata.mask.persistence.PersistenceSession; 93 import com.ivata.mask.persistence.right.PersistenceRights; 94 import com.ivata.mask.util.StringHandling; 95 import com.ivata.mask.valueobject.ValueObject; 96 97 109 public class HibernateManager implements QueryPersistenceManager, Serializable { 110 113 private static final Logger logger = Logger 114 .getLogger(HibernateManager.class); 115 116 119 private PersistenceRights persistenceRights; 120 125 private HibernateQueryFactory queryFactory; 126 131 private SessionFactory sessionFactory; 132 133 144 public HibernateManager(final SessionFactory sessionFactoryParam, 145 final HibernateQueryFactory queryFactoryParam, 146 final PersistenceRights persistenceRightsParam) { 147 this.sessionFactory = sessionFactoryParam; 148 this.queryFactory = queryFactoryParam; 149 this.persistenceRights = persistenceRightsParam; 150 } 151 152 160 public ValueObject add(final PersistenceSession session, 161 final ValueObject valueObject) throws PersistenceException { 162 HibernateSession hibernateSession = (HibernateSession) session; 163 Session wrappedSession = hibernateSession.getSession(); 164 Transaction wrappedTransaction = hibernateSession.getTransaction(); 165 166 try { 167 wrappedSession.save(valueObject); 168 wrappedSession.flush(); 169 } catch (Exception e) { 170 logger.error("Exception in add.", e); 171 try { 172 wrappedTransaction.rollback(); 173 } catch (HibernateException e2) { 174 throw new PersistenceException("Error rolling back a transaction", 175 e2); 176 } 177 throw new PersistenceException("Error saving a new instance of class '" 178 + valueObject.getClass().getName() 179 +"'", 180 e); 181 } 182 return valueObject; 183 } 184 191 public void addAddListener(Class dOClass, AddPersistenceListener listener) { 192 HibernateInterceptor.addAddListener(dOClass, listener); 193 } 194 195 196 203 public void addAmendListener(Class dOClass, AmendPersistenceListener listener) { 204 HibernateInterceptor.addAmendListener(dOClass, listener); 205 } 206 207 208 215 public void addRemoveListener(Class dOClass, RemovePersistenceListener listener) { 216 HibernateInterceptor.addRemoveListener(dOClass, listener); 217 } 218 219 228 public void amend(final PersistenceSession session, 229 final ValueObject baseDO) throws PersistenceException { 230 String className = baseDO.getClass().getName(); 231 HibernateSession hibernateSession = (HibernateSession) session; 232 Session wrappedSession = hibernateSession.getSession(); 233 Transaction wrappedTransaction = hibernateSession.getTransaction(); 234 235 try { 236 wrappedSession.update(baseDO); 237 } catch (Exception e) { 238 logger.error("Exception in amend.", e); 239 try { 240 wrappedTransaction.rollback(); 241 } catch (HibernateException e2) { 242 throw new PersistenceException("Error rolling back a transaction", 243 e2); 244 } 245 throw new PersistenceException("Error updating an instance of class '" 246 + baseDO.getClass().getName() 247 +"' with id '" 248 + baseDO.getIdString() 249 + "'", 250 e); 251 } 252 } 253 254 277 private Object execute(final PersistenceSession session, 278 final String queryName, 279 final Object [] queryArguments, 280 final Integer pageSize, 281 final Integer pageNumber, 282 final boolean delete) throws PersistenceException { 283 HibernateSession hibernateSession = (HibernateSession) session; 284 Session wrappedSession = hibernateSession.getSession(); 285 286 Object object = null; 287 HibernateQuery hibernateQuery = (HibernateQuery) queryFactory.generateQuery(queryName, 288 queryArguments); 289 Query q; 290 try { 291 q = wrappedSession.createQuery(hibernateQuery.getQueryString()); 292 Map arguments = hibernateQuery.getArguments(); 293 Set keys = arguments.keySet(); 294 for (Iterator keyIterator = keys.iterator(); keyIterator.hasNext();) { 295 String key = (String ) keyIterator.next(); 296 Object value = arguments.get(key); 297 q.setParameter(key, value); 298 } 299 } catch (HibernateException e) { 300 logger.error("Exception in execute.", e); 301 throw new PersistenceException("Error retrieving object " 302 + "with query '" 303 + hibernateQuery.getQueryString() 304 + "', " 305 + hibernateQuery.getArguments(), 306 e); 307 } 308 309 if (delete 312 || (pageNumber != null)) { 313 List results; 314 try { 315 if ((pageSize != null) 317 && (pageNumber != null)) { 318 q.setMaxResults(pageSize.intValue()); 319 q.setFirstResult(pageSize.intValue() * pageNumber.intValue()); 320 } 321 results = q.list(); 322 } catch (HibernateException e) { 323 throw new PersistenceException(queryName, e); 324 } 325 if (delete) { 327 results.clear(); 328 results = null; 329 } else { 330 object = results; 331 } 332 333 } else { 335 try { 336 object = q.uniqueResult(); 337 } catch (HibernateException e) { 338 throw new PersistenceException(queryName, e); 339 } 340 if (object == null) { 341 throw new FinderException(queryName, queryArguments); 342 } 343 } 344 return object; 345 } 346 347 356 public List find(final PersistenceSession session, 357 final String queryName, 358 final Object [] queryArguments) throws PersistenceException { 359 return find(session, queryName, queryArguments, null, new Integer (0)); 360 } 361 362 363 380 public List find(final PersistenceSession session, 381 final String queryName, 382 final Object [] queryArguments, 383 final Integer pageSize, 384 final Integer pageNumber) throws PersistenceException { 385 return (List ) execute(session, queryName, queryArguments, pageSize, 386 pageNumber, false); 387 } 388 389 390 398 public List findAll(final PersistenceSession session, 399 final Class dOClass) throws PersistenceException { 400 HibernateSession hibernateSession = (HibernateSession) session; 401 Session wrappedSession = hibernateSession.getSession(); 402 403 List results = null; 404 try { 405 results = wrappedSession.find("from " 406 + dOClass.getName()); 407 } catch (HibernateException e) { 408 logger.error("Exception in findAll.", e); 409 throw new PersistenceException("Error retrieving all objects from " 410 + dOClass.getName(), 411 e); 412 } 413 return results; 414 } 415 416 425 public ValueObject findByPrimaryKey(final PersistenceSession session, 426 final Class dOClass, 427 final Serializable key) throws PersistenceException { 428 HibernateSession hibernateSession = (HibernateSession) session; 429 Session wrappedSession = hibernateSession.getSession(); 430 431 if (key == null) { 432 throw new PersistenceException(dOClass.getName() 433 + ": key is null"); 434 } 435 436 ValueObject baseDO = null; 437 Transaction transaction; 438 try { 439 Integer id = StringHandling.integerValue(key.toString()); 442 baseDO = (ValueObject) wrappedSession.load(dOClass, id); 443 } catch (ObjectNotFoundException e) { 444 throw new FinderException(dOClass, key, e); 445 } catch (HibernateException e) { 446 logger.error("Exception in findByPrimaryKey.", e); 447 throw new PersistenceException(e); 448 } 449 if (baseDO == null) { 450 throw new FinderException(dOClass, key, null); 451 } 452 return baseDO; 453 } 454 455 456 465 public ValueObject findInstance(final PersistenceSession session, 466 final String queryName, 467 final Object [] queryArguments) throws PersistenceException { 468 return (ValueObject) execute(session, queryName, queryArguments, null, null, false); 469 } 470 471 480 public Integer findInteger(final PersistenceSession session, 481 final String queryName, 482 final Object [] queryArguments) throws PersistenceException { 483 return (Integer ) execute(session, queryName, queryArguments, null, null, false); 484 } 485 486 487 496 public String findString(final PersistenceSession session, 497 final String queryName, 498 final Object [] queryArguments) throws PersistenceException { 499 return (String ) execute(session, queryName, queryArguments, null, null, false); 500 } 501 506 public PersistenceRights getPersistenceRights() { 507 return persistenceRights; 508 } 509 510 511 518 public PersistenceSession openSession() throws PersistenceException { 519 return openSession(null); 520 } 521 522 523 530 public PersistenceSession openSession(Object systemSession) 531 throws PersistenceException { 532 try { 533 HibernateInterceptor interceptor = new HibernateInterceptor(this, 534 sessionFactory); 535 Session session = sessionFactory.openSession(interceptor); 536 HibernateSession hibernateSession = new HibernateSession(session, 537 session.beginTransaction(), 538 systemSession); 539 interceptor.setHibernateSession(hibernateSession); 540 return hibernateSession; 541 } catch (HibernateException e) { 542 logger.error("Exception in openSession.", e); 543 throw new PersistenceException("Error creating a new hibernate session.", 544 e); 545 } 546 } 547 548 557 public void remove(final PersistenceSession session, 558 final Class dOClass, 559 final Serializable key) throws PersistenceException { 560 HibernateSession hibernateSession = (HibernateSession) session; 561 Session wrappedSession = hibernateSession.getSession(); 562 Transaction wrappedTransaction = hibernateSession.getTransaction(); 563 try { 564 wrappedSession.delete("from " 565 + dOClass.getName() 566 + " dO where dO.id = " 567 + key); 568 } catch (Exception e) { 569 logger.error("Exception in remove.", e); 570 try { 571 wrappedTransaction.rollback(); 572 } catch (HibernateException e2) { 573 throw new PersistenceException("Error rolling back a transaction", 574 e2); 575 } 576 throw new PersistenceException("Error removing an instance of class '" 577 + dOClass.getName() 578 +"' with id '" 579 + key 580 + "'", 581 e); 582 } 583 } 584 585 593 public void remove(final PersistenceSession session, 594 final ValueObject valueObject) throws PersistenceException { 595 remove(session, valueObject.getClass(), valueObject.getIdString()); 596 } 597 598 608 public void removeAll(final PersistenceSession session, 609 final String queryName, 610 final Object [] queryArguments) throws PersistenceException { 611 execute(session, queryName, queryArguments, null, null, true); 612 } 613 } 614 | Popular Tags |