如何在persistence.xml中支持多个配置?

时间:2017-03-01 12:18:03

标签: java hibernate jpa deployment

我正在以JPA模式开发一个带有Hibernate的纯Java应用程序。文件persistence.xml包含一个持久性单元:

  • 包含数据库的访问凭据
  • 使用类标记
  • 列出所有使用过的entites
  • 定义了其他选项,例如在每次启动应用程序时自动创建架构

现在我们正在发布应用程序,我希望有一个配置:测试模式,开发模式和生产模式。他们显然会有不同的数据库访问凭据和自动更新选项。

我能想到的唯一可能性对我来说只有缺点:

  1. 有多个persistence.xml吗?不好主意,因为实体类是在持久性单元内声明的。我必须在三个persistence.xml文件中维护它们
  2. 在一个persistence.xml中有多个持久性单元?也是个坏主意,因为我必须将所有实体类标签复制到每个标签。
  3. 我该怎么做?

3 个答案:

答案 0 :(得分:0)

我能想到的一个解决方案是,如果您有办法检测应用程序的环境,可以使用不同的属性启动它。 而不是打电话:

Persistence.createEntityManagerFactory("our.unit");

使用

Map<String, Object> props = new TreeMap<>();
Persistence.createEntityManagerFactory("our.unit",props);

根据环境填充属性。

当然,除非您正在使用CDI。

答案 1 :(得分:0)

如果您将同时使用两个持久性单元的实体,为什么需要将所有 标签复制到每个标签?

为什么你没有使用

  

<exclude-unlisted-classes>false</exclude-unlisted-classes>

例如:

<persistence 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"
    version="2.1">

    <persistence-unit name="persistenceUnit_1">
        <provider> xxx </provider>
        <jta-data-source> xxxx  </jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties> 
            //Properties of first persistence unit
        </properties>
    </persistence-unit>

    <persistence-unit name="persistenceUnit_2">
        <provider> xxx </provider>
        <jta-data-source> xxxx  </jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties> 
            //Properties of second persistence unit
        </properties>
    </persistence-unit>

</persistence>

在这种情况下,您需要按名称使用它,例如

@PersistenceContext(unitName = "persistenceUnit_1")
private EntityManager entityManager;

答案 2 :(得分:0)

试试这个:

在你的 src\main\resources\META-INF\persistence.xml 文件中

<?xml version="1.0" encoding="utf-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">


    <persistence-unit name="schemaTest" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>    
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://x.x.x.x/SCHEMA_TEST?serverTimezone=UTC" />
            <property name="javax.persistence.jdbc.user" value="xxx" />
            <property name="javax.persistence.jdbc.password" value="xxx" />
            <property name="javax.persistence.schema-generation.database.action" value="update" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
            <property name="hibernate.jdbc.time_zone" value="UTC" />
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.format_sql" value="false" />
            <property name="use_sql_comments" value="false" />
        </properties>
    </persistence-unit>


    <persistence-unit name="schemaProd" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://x.x.x:x/SCHEMA_PROD?serverTimezone=UTC" />
            <property name="javax.persistence.jdbc.user" value="xxx" />
            <property name="javax.persistence.jdbc.password" value="xxx" />
            <property name="javax.persistence.schema-generation.database.action" value="update" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
            <property name="hibernate.jdbc.time_zone" value="UTC" />
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.format_sql" value="false" />
            <property name="use_sql_comments" value="false" />
        </properties>
    </persistence-unit>


</persistence>

现在,关于进行查询的方法:

字符串 'argSchema' 应根据您当前的需要设置在 'schemaTest' 和 'schemaProd' 之间。

String argSchema = "schemaTest";
SessionFactory factory = (SessionFactory) 
Persistence.createEntityManagerFactory(argSchema);
        
        Session session = factory.openSession();
        Transaction tx = null;
            
        try {
            tx = session.beginTransaction();
...
tx.commit();