默认值persistence.xml变量由环境变量设置



tl; dr; dr:我想用一个环境变量填充persistence.xml中的变量,或者如果不存在此类环境变量,则它是先前定义的默认值。


我想在docker的启动时动态地设置我的persistence.xml中的Hibernate的默认方案。因此,我在以下属性中添加了一个变量,可以使用环境变量设置该变量:

<property name="hibernate.default_schema" value="${env.DB_SCHEME}"/>

这对Docker环境非常有用,但是对于非docker环境,我需要注入某种默认值。

可悲的是我不能使用类似的东西,因为它不支持:

<property name="hibernate.default_schema" value="${env.DB_SCHEMA:my_default_scheme}"/>

我还尝试在项目的Maven属性中添加属性env.DB_SCHEME,但是这样,它总是使用Maven的值,我不能再用环境变量对其进行覆盖。

我阅读的另一件事是使用Maven中资源插件的过滤选项。这样,我可以用预定义的值替换变量。但是这样,我必须在构建时选择一个配置文件,并且无法在运行时更改。

此外,我尝试通过编程进行操作。因此,我将自己的持久性单位的实体管理器进行了检查,并检查了环境变量是否设置。如果设置(仅在使用Docker环境时),则应将${env.DB_SCHEME}放置在属性的值中。否则,它可能已将${DB_SCHEME}放置在其中,以便Maven的属性稍后可以覆盖它。但是某种程度上,属性尚未设置。也许该代码执行得太晚了,因为属性Hibernate.hbm2ddl.auto设置为验证。

如果您使用Payara应用程序容器(版本&gt; = 4.1.2.172),则可以使用这样的语法:

${ENV=PG_DATASOURCE_NAME}

我的 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="${ENV=PG_DATASOURCE_NAME}" transaction-type="JTA">
        <jta-data-source>${ENV=PG_DATASOURCE_NAME}</jta-data-source>
        <properties>
            <property name="hibernate.show_sql" value="true"/>
            <property name="javax.persistence.sharedCache.mode" value="NONE" />
        </properties>
    </persistence-unit>
</persistence>

在文档中有关此主题的更多信息。

最新更新