Hibernate JTA:读取每个环境的数据库连接参数

Sur*_*non 8 java hibernate jpa jta

我正在编写一个使用hibernate的javaEE应用程序.该应用程序将在多个环境(dev,qa,prod等)上运行,并且将具有与它们中的每一个相关联的单独的dbs.我想为每个环境分别设置jdbc-url,username,password等hibernate属性.

我目前persistence.xml看起来像:

    <persistence-unit name="PU" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <validation-mode>CALLBACK</validation-mode>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
            <property name="hibernate.hbm2ddl.auto" value="validate" />

            <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
            <property name="hibernate.event.merge.entity_copy_observer" value="allow"/>

            <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver"/>
            <property name="hibernate.connection.url" value="jdbc:oracle:thin:@host/schema"/>

            <property name="hibernate.connection.username" value="abc"/>
            <property name="hibernate.connection.password" value="***"/>    

        </properties>
    </persistence-unit>
Run Code Online (Sandbox Code Playgroud)

我在我的java代码中使用持久性单元如下:

@PersistenceContext(unitName = "PU")
private EntityManager em; 
Run Code Online (Sandbox Code Playgroud)

有没有办法可以将存储在不同属性文件中的hibernate属性注入到不同环境的EntityManager中?

请注意我使用的是JTA,因此无法使用EntityManagerFactory.我也不是也不想用春天.

Adr*_*hum 5

BAAAAAAD的想法是在您的应用程序WAR/EAR包中包含特定于环境的信息(通过包含多个配置,或者为不同的环境创建不同的包).例如,应在容器中维护不同的数据库.

在你的情况下,你persistence.xml应该看起来像:

<persistence>
   <persistence-unit name="PU">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>jdbc/fooAppDs</jta-data-source>
      <properties>
         ... ...
      </properties>
   </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

当然你应该有相应的资源参考jdbc/fooAppDs.

通过这样做,您可以在任何环境中部署应用程序.您只需在容器中创建正确的数据源并将其分配给jdbc/fooAppDs.


我相信另一种方法,虽然我不推荐,但是通过hibernate.cfg.xml在classpath中创建.您可能希望拥有本地文件系统位置并将其添加到类路径中,而不是将文件放在JAR/WAR/EAR中.