简体   繁体   English

春季环境概况和JPA

[英]Spring Environment Profiles & JPA

I want to implement environment profiles in my Spring JSON API application to handle multiple environments, development, testing, production. 我想在我的Spring JSON API应用程序中实现环境配置文件,以处理多个环境,开发,测试,生产。 I've seen examples such as Unable to use JNDI DataSource provided by Tomcat in Spring? 我已经看过诸如无法在春季使用Tomcat提供的JNDI DataSource之类的示例 . I really only need to handle different database settings at this point but later I may need additional bean configuration depending on environment. 此时,我实际上只需要处理不同的数据库设置,但是稍后,根据环境,可能需要其他bean配置。

My persistence.xml currently looks like this. 我的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="t0mc@t2014" />

            <!-- 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>

I've seen different examples so I'm a little confused how to implement. 我看到了不同的示例,因此我对如何实现有些困惑。

  1. Can you still use the Tomcat datasource configuration? 您仍然可以使用Tomcat数据源配置吗? If so how does it know which profile to use? 如果是这样,它如何知道要使用哪个配置文件?

  2. How do you configure persistence.xml for multiple environments? 如何为多个环境配置persistence.xml? Should the jdbc connection props even be in persistence.xml jdbc连接道具是否应该在persistence.xml中

  3. How do you set the active profile without recompiling? 如何设置活动配置文件而无需重新编译?

1. Can you still use the Tomcat datasource configuration? 1.您仍然可以使用Tomcat数据源配置吗? If so how does it know which profile to use? 如果是这样,它如何知道要使用哪个配置文件?

You can use the Tomcat datasourse configuration however the datasource definition will have nothing to do with Spring or Spring profiles. 您可以使用Tomcat datasourse配置,但是数据源定义与Spring或Spring配置文件无关。 If you are using JNDI approach then you may have multiple datasources defined and can specify that one used in you application via profile properties however the actual definition will have nothing to do with Spring. 如果您使用的是JNDI方法,则可能定义了多个数据源,并且可以通过概要文件属性指定在您的应用程序中使用的一个数据源,但是实际定义与Spring无关。

Or, you can use a non-JNDI datasource ie configured in Spring and perhaps using profiles. 或者,您可以使用非JNDI数据源,即在Spring中进行配置,也可以使用配置文件。

2. How do you configure persistence.xml for multiple environments? 2.如何为多个环境配置persistence.xml? Should the jdbc connection props even be in persistence.xml jdbc连接道具是否应该在persistence.xml中

No, you only need a minimal persistence.xml when using Spring or perhaps not at all. 不,使用Spring时只需要一个最小的persistence.xml,或者根本不需要。

3. How do you set the active profile without recompiling? 3.如何设置活动配置文件而不重新编译?

You can't 你不能

The following is all you need to get up and running with a non-JNDI datasource. 以下是使用非JNDI数据源启动并运行所需的全部内容。

Example Spring Configuration (non-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>

Example Spring Datasource Definition Spring数据源定义示例

<?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>

Example Spring Profile Definition: Spring Profile定义示例:

<?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>

Minimal 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>

Sample Profile Properties File: 样本概要文件属性文件:

#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
  1. Since I didn't have much in common with Tomcat I will just provide a link to a similar question: 由于我与Tomcat没有太多共同之处,因此我将提供一个指向类似问题的链接:
    Using dynamic Datasource with Tomcat 在Tomcat中使用动态数据源
  2. JPA allows to define multiple persistence units in a single persistence.xml file so you would at least need to change their names to be unique within scope of its packaging (in terms of Web Archive, EJB JAR, etc.): 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 allows to specify persistence provider properties at runtime by using an overloaded createEntityManagerFactory method: 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 ... 

    The properties passed to the method are combined with those already specified in persistence.xml so this way you can get truly configurable, multi-purpose and dynamic configuration. 传递给该方法的属性与persistence.xml中已指定的属性组合在一起,因此您可以通过这种方式获得真正可配置的,多功能的和动态的配置。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM