/src/main/java/org/nnga/tsp/persistence/config/impl/HibernateSessionProviderImpl.java

https://github.com/toribaric/portfoliosupportsystem · Java · 96 lines · 75 code · 18 blank · 3 comment · 10 complexity · acb459c12bcf92b8c616ea964035c082 MD5 · raw file

  1. package org.nnga.tsp.persistence.config.impl;
  2. import org.apache.log4j.Logger;
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.cfg.AnnotationConfiguration;
  6. import javax.persistence.Entity;
  7. import org.nnga.tsp.persistence.config.HibernateSessionProvider;
  8. import org.nnga.tsp.persistence.entity.PersistenceEntity;
  9. import org.scannotation.AnnotationDB;
  10. import org.scannotation.ClasspathUrlFinder;
  11. import java.io.IOException;
  12. import java.net.URL;
  13. import java.sql.Connection;
  14. import java.util.Map;
  15. import java.util.Set;
  16. public class HibernateSessionProviderImpl implements HibernateSessionProvider {
  17. private static final Logger LOGGER = Logger.getLogger(HibernateSessionProviderImpl.class);
  18. private SessionFactory sessionFactory;
  19. public HibernateSessionProviderImpl(String driverClass, String connectionUrl, String username, String password) {
  20. this(driverClass, connectionUrl, username, password, new Class<?>[]{PersistenceEntity.class});
  21. }
  22. public HibernateSessionProviderImpl(String driverClass, String connectionUrl, String username, String password, Class<?>... classBases) {
  23. try {
  24. AnnotationConfiguration config = new AnnotationConfiguration();
  25. config.setProperty("hibernate.connection.autocommit", "true");
  26. config.setProperty("hibernate.connection.isolation", String.valueOf(Connection.TRANSACTION_READ_UNCOMMITTED));
  27. config.setProperty("hibernate.show_sql", "false");
  28. config.setProperty("hibernate.use_outer_join", "true");
  29. config.setProperty("hibernate.connection.driver_class", driverClass);
  30. config.setProperty("hibernate.transaction.factory_class", "org.hibernate.transaction.JDBCTransactionFactory");
  31. config.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
  32. config.setProperty("hibernate.connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider");
  33. config.setProperty("hibernate.c3p0.acquire_increment", "1");
  34. config.setProperty("hibernate.c3p0.max_size", "20");
  35. config.setProperty("hibernate.c3p0.min_size", "0");
  36. config.setProperty("hibernate.c3p0.timeout", "5000");
  37. config.setProperty("hibernate.c3p0.max_statements", "0");
  38. config.setProperty("hibernate.connection.url", connectionUrl);
  39. config.setProperty("hibernate.connection.username", username);
  40. if (null != password) {
  41. config.setProperty("hibernate.connection.password", password);
  42. }
  43. if (classBases == null || classBases.length == 0) {
  44. classBases = new Class<?>[]{PersistenceEntity.class};
  45. }
  46. loadEntityClasses(config, classBases);
  47. sessionFactory = config.buildSessionFactory();
  48. } catch (Throwable ex) {
  49. LOGGER.error(ex.getMessage(), ex);
  50. throw new ExceptionInInitializerError(ex);
  51. }
  52. }
  53. /**
  54. * Search for classes annotated with @Entity in base packages of class(es) given by classBasses argument
  55. */
  56. private void loadEntityClasses(AnnotationConfiguration config, Class<?>... classBases) throws IOException, ClassNotFoundException {
  57. AnnotationDB db = new AnnotationDB();
  58. for (Class<?> classBase : classBases) {
  59. db.scanArchives(getEntityPackage(classBase));
  60. Map<String, Set<String>> annotationIndex = db.getAnnotationIndex();
  61. Set<String> entityClassNames = annotationIndex.get(Entity.class.getName());
  62. if (null == entityClassNames) {
  63. LOGGER.warn("No entity classes loaded!");
  64. return;
  65. }
  66. for (String s : entityClassNames) {
  67. config.addAnnotatedClass(getClass().getClassLoader().loadClass(s));
  68. }
  69. }
  70. }
  71. private URL getEntityPackage(Class<?> classBase) {
  72. return ClasspathUrlFinder.findClassBase(classBase);
  73. }
  74. @Override
  75. public Session getSession() {
  76. return sessionFactory.openSession();
  77. }
  78. }