/** Generate database schema and initial data for a defined dialect */ public static void generateDatabase(String dialect) throws IOException { // Configure Hibernate log.info("Exporting Database Schema..."); String dbSchema = EnvironmentDetector.getUserHome() + "/schema.sql"; Configuration cfg = getConfiguration().configure(); cfg.setProperty("hibernate.dialect", dialect); SchemaExport se = new SchemaExport(cfg); se.setOutputFile(dbSchema); se.setDelimiter(";"); se.setFormat(false); se.create(false, false); log.info("Database Schema exported to {}", dbSchema); String initialData = new File("").getAbsolutePath() + "/src/main/resources/default.sql"; log.info("Exporting Initial Data from '{}'...", initialData); String initData = EnvironmentDetector.getUserHome() + "/data.sql"; FileInputStream fis = new FileInputStream(initialData); String ret = DatabaseDialectAdapter.dialectAdapter(fis, dialect); FileWriter fw = new FileWriter(initData); IOUtils.write(ret, fw); fw.flush(); fw.close(); log.info("Initial Data exported to {}", initData); }
/** Get instance */ public static SessionFactory getSessionFactory(String hbm2ddl) { if (sessionFactory == null) { try { // Configure Hibernate Configuration cfg = getConfiguration().configure(); cfg.setProperty("hibernate.dialect", Config.HIBERNATE_DIALECT); cfg.setProperty("hibernate.connection.datasource", Config.HIBERNATE_DATASOURCE); cfg.setProperty("hibernate.hbm2ddl.auto", hbm2ddl); cfg.setProperty("hibernate.show_sql", Config.HIBERNATE_SHOW_SQL); cfg.setProperty("hibernate.generate_statistics", Config.HIBERNATE_STATISTICS); cfg.setProperty("hibernate.search.analyzer", Config.HIBERNATE_SEARCH_ANALYZER); cfg.setProperty( "hibernate.search.default.directory_provider", "org.hibernate.search.store.FSDirectoryProvider"); cfg.setProperty("hibernate.search.default.indexBase", Config.HIBERNATE_SEARCH_INDEX_HOME); cfg.setProperty("hibernate.search.default.optimizer.operation_limit.max", "500"); cfg.setProperty("hibernate.search.default.optimizer.transaction_limit.max", "75"); cfg.setProperty("hibernate.worker.execution", "async"); // http://relation.to/Bloggers/PostgreSQLAndBLOBs // cfg.setProperty("hibernate.jdbc.use_streams_for_binary", "false"); // Show configuration log.info("Hibernate 'hibernate.dialect' = {}", cfg.getProperty("hibernate.dialect")); log.info( "Hibernate 'hibernate.connection.datasource' = {}", cfg.getProperty("hibernate.connection.datasource")); log.info( "Hibernate 'hibernate.hbm2ddl.auto' = {}", cfg.getProperty("hibernate.hbm2ddl.auto")); log.info("Hibernate 'hibernate.show_sql' = {}", cfg.getProperty("hibernate.show_sql")); log.info( "Hibernate 'hibernate.generate_statistics' = {}", cfg.getProperty("hibernate.generate_statistics")); log.info( "Hibernate 'hibernate.search.default.directory_provider' = {}", cfg.getProperty("hibernate.search.default.directory_provider")); log.info( "Hibernate 'hibernate.search.default.indexBase' = {}", cfg.getProperty("hibernate.search.default.indexBase")); if (HBM2DDL_CREATE.equals(hbm2ddl)) { // In case of database schema creation, also clean filesystem data. // This means, conversion cache, file datastore and Lucene indexes. log.info("Cleaning filesystem data from: {}", Config.REPOSITORY_HOME); FileUtils.deleteQuietly(new File(Config.REPOSITORY_HOME)); } // Create database schema, if needed sessionFactory = cfg.buildSessionFactory(); if (HBM2DDL_CREATE.equals(hbm2ddl)) { log.info("Executing specific import for: {}", Config.HIBERNATE_DIALECT); InputStream is = ConfigUtils.getResourceAsStream("default.sql"); String adapted = DatabaseDialectAdapter.dialectAdapter(is, Config.HIBERNATE_DIALECT); executeImport(new StringReader(adapted)); IOUtils.closeQuietly(is); } if (HBM2DDL_CREATE.equals(hbm2ddl) || HBM2DDL_UPDATE.equals(hbm2ddl)) { // Create or update translations for (String res : ConfigUtils.getResources("i18n")) { String oldTrans = null; String langId = null; // Preserve translation changes if (HBM2DDL_UPDATE.equals(hbm2ddl)) { langId = FileUtils.getFileName(res); log.info("Preserving translations for: {}", langId); oldTrans = preserveTranslations(langId); } InputStream isLang = ConfigUtils.getResourceAsStream("i18n/" + res); log.info("Importing translation: {}", res); executeImport(new InputStreamReader(isLang)); IOUtils.closeQuietly(isLang); // Apply previous translation changes if (HBM2DDL_UPDATE.equals(hbm2ddl)) { if (oldTrans != null) { log.info("Restoring translations for: {}", langId); executeImport(new StringReader(oldTrans)); } } } // Replace "create" or "update" by "none" to prevent repository reset on restart if (Boolean.parseBoolean(Config.HIBERNATE_CREATE_AUTOFIX)) { log.info("Executing Hibernate create autofix"); hibernateCreateAutofix(Config.HOME_DIR + "/" + Config.OPENKM_CONFIG); } else { log.info( "Hibernate create autofix not executed because of {}={}", Config.PROPERTY_HIBERNATE_CREATE_AUTOFIX, Config.HIBERNATE_CREATE_AUTOFIX); } } } catch (HibernateException e) { log.error(e.getMessage(), e); throw new ExceptionInInitializerError(e); } catch (URISyntaxException e) { log.error(e.getMessage(), e); throw new ExceptionInInitializerError(e); } catch (IOException e) { log.error(e.getMessage(), e); throw new ExceptionInInitializerError(e); } } return sessionFactory; }