/******************************************************************************* * Copyright 2016 * Ubiquitous Knowledge Processing (UKP) Lab * Technische Universität Darmstadt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package de.tudarmstadt.ukp.lmf.hibernate; import java.io.File; import java.io.IOException; import java.util.HashSet; import java.util.Properties; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.cfg.Configuration; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import de.tudarmstadt.ukp.lmf.transform.DBConfig; /** * This class offers methods for conecting to a database. * * @author Yevgen Chebotar * @author Zijad Maksuti * */ public class HibernateConnect { private static Log logger = LogFactory.getLog(HibernateConnect.class.getName()); /** * Creates Hibernate {@link Configuration} and adds all files from Hibernate mapping folder to * the model. * * @param dbConfig * database configuration holder * * @return the created Hibernate Configuration */ public static Configuration getConfiguration(DBConfig dbConfig) { Configuration cfg = new Configuration().addProperties(getProperties( dbConfig.getJdbc_url(), dbConfig.getJdbc_driver_class(), dbConfig.getDb_vendor(), dbConfig.getUser(), dbConfig.getPassword(), dbConfig.isShowSQL())); // load hibernate mappings ClassLoader cl = HibernateConnect.class.getClassLoader(); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver( cl); Resource[] mappings = null; try { mappings = resolver .getResources("hibernatemap/access/**/*.hbm.xml"); for (Resource mapping : mappings) { cfg.addURL(mapping.getURL()); } } catch (IOException e) { logger.error("Hibernate mappings not found!"); e.printStackTrace(); } return cfg; } /** * This method creates and returns Hibernate Properties. * * @param jdbc_url * Host_to_the_database/database_name * @param jdbc_driver_class * driver used to connect * @param db_vendor * database vendor * @param user * user name * @param password * password * @param showSQL * set to true in order to print all SQL-queries to the console * * @return hibernate properties based on the consumed parameters * * @see Properties */ public static Properties getProperties(String jdbc_url, String jdbc_driver_class, String db_vendor, String user, String password, boolean showSQL) { Properties p = new Properties(); /* * <property name="driverClassName" value="org.h2.Driver"/> <property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"/> </bean> <bean id="jpaAdaptor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="showSql" value="false" /> <!-- Let Hibernate generate the DDL for the schema --> <property name="generateDdl" value="true" /> <property name="databasePlatform" value="org.hibernate.dialect.H2Dialect" /> */ // Database connection settings common for mysql and h2 p.setProperty("hibernate.connection.driver_class", jdbc_driver_class); p.setProperty("hibernate.connection.characterEncoding", "UTF-8"); p.setProperty("hibernate.connection.useUnicode", "true"); p.setProperty("hibernate.connection.charSet", "UTF-8"); p.setProperty("hibernate.connection.username", user); p.setProperty("hibernate.connection.password", password); // connection url if (!jdbc_url.startsWith("jdbc:")) { if (db_vendor.equals("mysql")) { p.setProperty("hibernate.connection.url", "jdbc:"+db_vendor+"://" +jdbc_url+"?characterEncoding=UTF-8&useUnicode=true"); } else if (db_vendor.equals("h2")){ p.setProperty("hibernate.connection.url", "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"); } } else { p.setProperty("hibernate.connection.url", jdbc_url); } // JDBC connection pool (use the built-in) --> // p.setProperty("hibernate.connection.pool_size","1"); //Using c3p0 instead now for better connection handling p.setProperty("hibernate.c3p0.min_size","1"); p.setProperty("hibernate.c3p0.max_size","1"); p.setProperty("hibernate.c3p0.timeout","0"); p.setProperty("hibernate.c3p0.max_statements","0"); p.setProperty("hibernate.c3p0.idle_test_period","5"); // SQL dialect if (db_vendor.equals("mysql")) { p.setProperty("hibernate.dialect", UBYMySQLDialect.class.getName()); } else if (db_vendor.equals("h2")) { p.setProperty("hibernate.dialect", UBYH2Dialect.class.getName()); } else { p.setProperty("hibernate.dialect", db_vendor); } // Enable Hibernate's automatic session context management p.setProperty("hibernate.current_session_context_class","thread"); // Disable the second-level cache p.setProperty("hibernate.cache.provider_class","org.hibernate.cache.NoCacheProvider"); //p.setProperty("hibernate.cache.provider_class","org.hibernate.connection.C3P0ConnectionProvider"); p.setProperty("hibernate.order_inserts", "true"); p.setProperty("hibernate.order_updates", "true"); //p.setProperty("hibernate.cache.provider_class","org.hibernate.cache.OSCacheProvider"); p.setProperty("hibernate.jdbc.batch_size", "100"); p.setProperty("hibernate.cache.use_second_level_cache" , "false"); p.setProperty("hibernate.cache.use_query_cache", "false"); // Echo all executed SQL to stdout if(showSQL) { p.setProperty("hibernate.show_sql","true"); } else { p.setProperty("hibernate.show_sql","false"); } // Do only update schema on changes e.g. validate | update | create | create-drop // p.setProperty("hibernate.hbm2ddl.auto","update"); // JEK see http://stackoverflow.com/questions/3179765/how-to-turn-off-hbm2ddl p.setProperty("hibernate.hbm2ddl.auto","validate"); // if (db_vendor.equals("mysql")) { // p.setProperty("hibernate.hbm2ddl.auto","validate"); // } else if (db_vendor.equals("h2")) { // p.setProperty("hibernate.hbm2ddl.auto","update"); // } // p.setProperty("hibernate.hbm2ddl.auto","none"); return p; } /** * Returns all files from the folder and its subfolders * * @deprecated this method is marked for deletion */ @Deprecated public static Set<File> getAllFiles(File folder) { Set<File> result = new HashSet<File>(); if(folder.isFile() && folder.getName().endsWith(".hbm.xml")){ result.add(folder); }else if(folder.isDirectory()){ for(File f : folder.listFiles()){ result.addAll(getAllFiles(f)); } } return result; } }