动态更改持久性单元 - JPA

时间:2013-09-03 04:01:49

标签: java jpa persistence.xml

在构建应用程序期间会创建persistence.xml中的持久性单元。由于我想在运行时更改数据库URL,有没有办法在运行时修改持久性单元?我应该在分发后使用不同于预绑定数据库的不同数据库。

我正在使用EclipseLink(JPA 2.1)

4 个答案:

答案 0 :(得分:30)

保持持久性单元文件(Persistence.xml)不变。您可以按如下方式覆盖其中的属性。

EntityManagerFactory managerFactory = null;
Map<String, String> persistenceMap = new HashMap<String, String>();

persistenceMap.put("javax.persistence.jdbc.url", "<url>");
persistenceMap.put("javax.persistence.jdbc.user", "<username>");
persistenceMap.put("javax.persistence.jdbc.password", "<password>");
persistenceMap.put("javax.persistence.jdbc.driver", "<driver>");

managerFactory = Persistence.createEntityManagerFactory("<current persistence unit>", persistenceMap);
manager = managerFactory.createEntityManager();

答案 1 :(得分:2)

您可以使用Persistence.createEntityManagerFactory(Map)传递属性以选择数据库URL和其他设置。

答案 2 :(得分:0)

在长期会话架构中,您应该创建一个Plug-in-Framework。

因此,您需要创建一个不同的Thread-Group和Class-Repository。

这可能是你的Class-Loader-Tree

  • System-Class-Loader(通常是URLClassLoader,包含实体)
    • JPA-类加载器
      • jpa.jar 加载到persistence.xml,在Application-Class-Loader中指定数据库配置
      • 实施您的entityManager / session-factory。
      • 加载使用DataBase所需的任何插件。执行单元测试(; D)和插件集成测试。

答案 3 :(得分:0)

如果使用的是Thorntail框架,则可以连接persistence.xml文件以从“ project-defaults.yml”文件中获取运行时变量。

<persistence-unit name="java:jboss/datasources/my-postgres-ds">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>com.package.jpa.EntityClass1</class>
    <class>com.package.jpa.EntityClass2</class>
    <class>com.package.jpa.EntityClass3</class>
    <properties>
        <property name="hibernate.archive.autodetection" value="class"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>


        <property name="hibernate.connection.url"
                  value="${thorntail.datasources.data-sources.my-postgres-ds.connection-url}"/>
        <property name="hibernate.connection.username"
                  value="${thorntail.datasources.data-sources.my-postgres-ds.user-name}"/>
        <property name="hibernate.connection.password"
                  value="${thorntail.datasources.data-sources.my-postgres-ds.password}"/>


        <property name="hibernate.default_schema" value="public"/>
        <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>

</persistence-unit>

记下$ {...}中的动态数据库值,将其指向project-default.yml文件中的值。

然后您的project-defaults.yml文件将具有以下条目:

    thorntail:
       http:
         port: 8989
       datasources:
          data-sources:
             my-postgres-ds:
                driver-name: my-postgres-driver
                connection-url: "jdbc:postgresql://localhost:5432/my-db-name"
                user-name: my-user-name
                password: "my-password#"
          jdbc-drivers:
             my-postgres-driver:
                driver-module-name: org.postgresql
                driver-xa-datasource-class-name: org.postgresql.xa.PGXADataSource

我希望这对于使用application.properties和persistence.xml的Spring引导同样适用