2015-06-26 7 views
1

Я пытаюсь настроить приложение Spring с помощью разных файлов .properties для спящего режима. Мой план состоял в том, чтобы создать свойство maven, которое будет отражать ту среду, которую я хочу выбрать, выбранную через профиль. А потом на моем hibernate.cfg.xml будет загружаться переменные свойств.Конфигурация среды Spring + Hibernate

Файл: hibernate.cfg.xml:

.... <property name="hbm2ddl.auto">${hibernate.hbm2ddl.auto}</property> ... 

Файл: persistence-dev.properties:

... hibernate.hbm2ddl.auto = create ... 

Файл: весна-context.xml:

... <context:property-placeholder location="classpath*:*persistence-${envTarget}.properties" /> ... 

Что я здесь пропал?

ответ

1

hibernate.cfg.xml не управляется весной.

Пытается использовать PropertyPlaceholderConfigurer (или его замена PropertySourcesPlaceholderConfigurer), чтобы отфильтровать его бесполезно.

Что вы можете сделать, это использовать Maven фильтрация ресурсов поддержка:

<profiles> 
    <profile> 
     <id>dev</id> 
     <properties> 
      <hibernate.hbm2ddl.auto>dev</hibernate.hbm2ddl.auto> 
     </properties> 
    </profile> 

    <profile> 
     <id>prod</id> 
     <properties> 
      <hibernate.hbm2ddl.auto>validate</hibernate.hbm2ddl.auto> 
     </properties> 
    </profile> 
</profiles> 

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
     </resource> 
    </resources> 
</build> 

Вы можете также использовать его в сочетании с поддержкой Spring профилей (предполагается, что вы готовы передать Весна имя профиля в Maven во время сборки, а не только с помощью выполнения, что вы будете делать в любом случае, если вы запускаете пружину профили, связанные тесты с Maven):

<profile> 
     <activation> 
      <property> 
       <name>spring.profiles.active</name> 
       <value>dev</value> 
      </property> 
     </activation> 
     <properties> 
      <hibernate.hbm2ddl.auto>dev</hibernate.hbm2ddl.auto> 
     </properties> 
    </profile> 
    ... 
+0

Работал как очарование! Спасибо! – Malf

+0

Теперь, возможно ли изменить свойство «hibernate.hbm2ddl.auto» только для одного определенного класса? – Malf

+0

Кроме того, можно ли делиться свойствами между профилями? – Malf

0

я достиг его ниже образом:

Сохраняет общие свойства для всей среды в файле hibernate.cfg.xml, как показано ниже.

<hibernate-configuration> 
     <session-factory> 

      <!-- JDBC connection pool (use the built-in) --> 
      <property name="connection.pool_size">1</property> 

      <!-- SQL dialect --> 
      <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

      <!-- Enable Hibernate's automatic session context management --> 
      <property name="current_session_context_class">thread</property> 


      <!-- Echo all executed SQL to stdout --> 
      <property name="show_sql">true</property> 

      <!-- Drop and re-create the database schema on startup --> 
      <property name="hbm2ddl.auto">update</property> 

      <!-- DB mapping if any -->  
      <mapping class='classname'></mapping> 


     </session-factory> 
    </hibernate-configuration> 

Добавьте свойства в HibernateUtil.java класса, который изменяется во время выполнения в соответствии с окружающей средой (URL, имя пользователя, пароль, диалект). Вы можете хранить эти значения свойств в разных файлах среды, таких как local.properties, dev.properties и загружать их во время выполнения.

import org.apache.commons.configuration2.FileBasedConfiguration; 
import org.apache.commons.configuration2.PropertiesConfiguration; 
import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder; 
import org.apache.commons.configuration2.builder.fluent.Parameters; 
import org.apache.commons.configuration2.ex.ConfigurationException; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 


public class HibernateUtil { 

    static private org.apache.commons.configuration2.Configuration loadTestData; 
    private static final SessionFactory sessionFactory; 

    public HibernateUtil(){ 
     loadTestData = loadPropertiesFile("local"); 
    } 

    static { 
     try { 

      Configuration cfg = new Configuration(); 
      cfg.setProperty("hibernate.connection.url", loadTestData.getString("connection.url")); 
      cfg.setProperty("hibernate.connection.username", loadTestData.getString("connection.username")); 
      cfg.setProperty("hibernate.connection.password", loadTestData.getString("connection.password")); 
      cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); 
      cfg.configure(); 

      sessionFactory = cfg.buildSessionFactory(); 
     } catch (Throwable ex) { 
      System.err.println("SessionFactory creation failed" + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 

    public static org.apache.commons.configuration2.Configuration loadPropertiesFile(String filename) { 
     Parameters params = new Parameters(); 
     FileBasedConfigurationBuilder<FileBasedConfiguration> builder = 
       new FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class) 
         .configure(params.properties() 
           .setFileName(filename + ".properties")); 
     try { 
      org.apache.commons.configuration2.Configuration config = builder.getConfiguration(); 
      return config; 
     } catch (ConfigurationException cex) { 
      // loading of the configuration file failed 
      System.out.println(filename + " is not loaded" + cex.getMessage()); 
      return null; 
     } 

    } 
} 

Ниже local.properties файла, который находится в папке ресурсов

#hibernate properties 
connection.url=jdbc:mysql://localhost:3306/rivigo 
connection.username=root 
connection.password=root 

Надеется, что это помогает!

Смежные вопросы