2014-09-27 2 views
0

Я хочу реализовать профили среды в своем приложении JSON Spring Spring для обработки нескольких сред, разработки, тестирования, производства. Я видел такие примеры, как Unable to use JNDI DataSource provided by Tomcat in Spring?. На данный момент мне действительно нужно обрабатывать разные настройки базы данных, но позже мне может понадобиться дополнительная конфигурация компонента в зависимости от среды.Spring Environment Profiles & JPA

В настоящее время мой persistence.xml выглядит так.

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" 
    xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 

    <persistence-unit name="BPPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 

     <!-- JNDI datasource --> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <non-jta-data-source>java:comp/env/jdbc/BloodPressureDB</non-jta-data-source> 

     <!-- Hibernate Settings --> 
     <properties> 

      <!-- java persistence settings --> 
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> 
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://127.0.0.1:5432/jkratz" /> 
      <property name="javax.persistence.jdbc.user" value="tomcat" /> 
      <property name="javax.persistence.jdbc.password" value="[email protected]" /> 

      <!-- hibernate settings --> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.format_sql" value="true" /> 
      <property name="hibernate.connection.charSet" value="UTF-8" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL9Dialect" /> 
      <property name="hibernate.hbm2ddl.auto" value="validate" /> 

     </properties> 

    </persistence-unit> 
</persistence> 

Я видел разные примеры, поэтому я немного смущен, как реализовать.

  1. Вы все еще можете использовать конфигурацию источника данных Tomcat? Если да, то как он знает, какой профиль использовать?

  2. Как настроить persistence.xml для нескольких сред? Если реквизиты подключения jdbc даже находятся в состоянии persistence.xml

  3. Как установить активный профиль без перекомпиляции?

ответ

2

1. Можете ли вы по-прежнему использовать конфигурацию источника данных Tomcat? Если да, то как он знает, какой профиль использовать?

Вы можете использовать конфигурацию данных Tomcat, однако определение источника данных не будет иметь ничего общего с профилями Spring или Spring. Если вы используете подход JNDI, вы можете указать несколько источников данных и указать, что один из них используется в вашем приложении через свойства профиля, однако фактическое определение не будет иметь ничего общего с Spring.

Или вы можете использовать источник данных, не относящийся к JNDI, который настроен весной и, возможно, использует профили.

2. Как настроить persistence.xml для нескольких сред? Если реквизиты подключения jdbc даже находятся в состоянии persistence.xml

Нет, вам нужно всего лишь минимальное сохранение persistence.xml при использовании Spring или, возможно, совсем нет.

3. Как настроить активный профиль без повторной компиляции?

Вы не

может Ниже все, что вам нужно, чтобы получить и работает с не JNDI источника данных.

Пример конфигурации Пружина (не JNDI):

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 

    <jpa:repositories base-package="uk.co.certait.spring.data.repository" /> 

    <bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="jpaVendorAdapter" ref="jpaAdapter"></property> 
     <property name="persistenceUnitName" value="persistenceUnit" /> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.hbm2ddl.auto">${hibernate.ddl.auto}</prop> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
       <prop key="hibernate.show_sql">${hibernate.show.sql}</prop> 
       <prop key="hibernate.format_sql">true</prop> 
       <prop key="hibernate.cache.use_second_level_cache">${hibernate.enable.cache}</prop> 
       <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="jpaAdapter" 
     class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 

    <bean class="org.springframework.orm.jpa.JpaTransactionManager" 
     id="transactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 
</beans> 

Пример Спринг Datasource Определение

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> 

    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName"> 
      <value>${database.driver}</value> 
     </property> 
     <property name="url"> 
      <value>${database.url}</value> 
     </property> 
     <property name="username"> 
      <value>${database.username}</value> 
     </property> 
     <property name="password"> 
      <value>${database.password}</value> 
     </property> 
    </bean> 

</beans> 

Пример Пружина профиля Определение:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> 

    <beans profile="default"> 
     <bean id="applicationPropertiesPlaceholder" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
      <property name="locations"> 
       <list> 
        <value>classpath:profiles/hsqldb.profile.properties</value> 
       </list> 
      </property> 
     </bean> 
    </beans> 

    <beans profile="hsqldb"> 
     <bean id="applicationPropertiesPlaceholder" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
      <property name="locations"> 
       <list> 
        <value>classpath:profiles/hsqldb.profile.properties</value> 
       </list> 
      </property> 
     </bean> 
    </beans> 

    <beans profile="mysql"> 
     <bean id="applicationPropertiesPlaceholder" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
      <property name="locations"> 
       <list> 
        <value>classpath:profiles/mysql.profile.properties</value> 
       </list> 
      </property> 
     </bean> 
    </beans> 

    <beans profile="mssql"> 
     <bean id="applicationPropertiesPlaceholder" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
      <property name="locations"> 
       <list> 
        <value>classpath:profiles/mssql.profile.properties</value> 
       </list> 
      </property> 
     </bean> 
    </beans> 

</beans> 

Минимально Persisteance.XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="persistenceUnit" 
     transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <properties> 
      <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" /> 
      <property name="hibernate.connection.charSet" value="UTF-8" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

Пример профиля Свойства файла:

#MySQL 
#database.url=jdbc:mysql://localhost:3306/test 
database.url=jdbc:log4jdbc:mysql://localhost:3306/test 
#database.driver=com.mysql.jdbc.Driver 
database.driver=net.sf.log4jdbc.DriverSpy 
database.username=root 
database.password=password 
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect 

hibernate.show.sql=false 
hibernate.ddl.auto=create 
hibernate.enable.cache=false 
+0

Спасибо за ответ и код примера! Вопрос о JNDI vs Spring Datasource, есть ли какие-либо компромиссы или опираются на использование JNDI над Non JNDI? – greyfox

1
  1. Поскольку у меня не было много общего с Tomcat я просто дать ссылку на аналогичный вопрос:
    Using dynamic Datasource with Tomcat
  2. JPA позволяет определить несколько единиц сохраняемости в одном файле persistence.xml так вы, по крайней мере, необходимо изменить их имена должны быть уникальными в пределах объема упаковки (в терминах Web Archive, EJB JAR и т.д.):

    <?xml version="1.0" encoding="UTF-8"?> 
    <persistence version="2.1" 
        xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
        http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    
        <persistence-unit name="BPPersistenceUnit-postgres" 
             transaction-type="RESOURCE_LOCAL"> 
         <!-- JNDI datasource --> 
         ... 
         <!-- properties --> 
         ... 
        </persistence-unit> 
        <persistence-unit name="BPPersistenceUnit-mysql" 
             transaction-type="RESOURCE_LOCAL"> 
         <!-- JNDI datasource --> 
         ... 
         <!-- properties --> 
         ... 
        </persistence-unit> 
    </persistence> 
    
  3. JPA позволяет задать свойства поставщика живучести во время выполнения, используя перегруженный createEntityManagerFactory метод:

    // dynamic configuration for PostgreSQL 
    Map<String, String> props = new HashMap<>(); 
    props.put("javax.persistence.jdbc.driver", "org.postgresql.Driver"); 
    ... 
    EntityManagerFactory pgEmf = 
    Persistence.createEntityManagerFactory("BPPersistenceUnit-postgres", props); 
    
    // dynamic configuration for MySQL 
    ... 
    

    свойства, передаваемое методу совмещается с уже определены в persistence.xml так таким образом, вы можете получить действительно конфигурируемыми , многоцелевой и динамической конфигурации.