Java persistence.xml 从 .properties 文件中导入数据库参数值

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19170876/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 14:42:44  来源:igfitidea点击:

persistence.xml to import database parameters values from .properties file

javaxmlhibernateshiropersistence.xml

提问by paulochf

Edit: not duplicate but almost

编辑:不重复但几乎

I would like to have my app persistence.xml to be something like

我想让我的应用程序 persistence.xml 类似于

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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_1_0.xsd"
                version="1.0">
   <persistence-unit name="appName" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="${db.dialect'}"/>
            <property name="javax.persistence.jdbc.driver" value="${db.driver}"/>
            <property name="javax.persistence.jdbc.user" value="${db.user}"/>
            <property name="javax.persistence.jdbc.password" value="${db.password}"/>
            <property name="javax.persistence.jdbc.url" value="${db.url}"/>
        </properties>
    </persistence-unit>
</persistence>

getting these placeholder values from a simple text file somewhere in my source folders.

从我的源文件夹中某处的简单文本文件中获取这些占位符值。

I read about that it's possible when using Spring doing like

我读到使用 Spring 时可以这样做

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <value>classpath:com/foo/jdbc.properties</value>
    </property>
</bean>

but here we are not using Spring, just Hibernate and some Primefaces.

但在这里我们没有使用 Spring,只使用 Hibernate 和一些 Primefaces。

Is it possible?

是否可以?

Thanks!

谢谢!

Edit: I didn't mention some things, but for reference, I'm also using Shiro Security and Ant to do some stuff. I'll post the solution as an answer. This makes my project have 3 different files with database parameters:

编辑:我没有提到一些事情,但作为参考,我也在使用 Shiro Security 和 Ant 来做一些事情。我将发布解决方案作为答案。这使我的项目有 3 个不同的带有数据库参数的文件:

  • persistence.xml (Hibernate)
  • context.xml (Shiro)
  • database.properties (for Flyway tasks in Ant)
  • 持久性.xml(休眠)
  • context.xml (Shiro)
  • database.properties(用于 Ant 中的 Flyway 任务)

采纳答案by paulochf

I edited to mention I'm using Shiro Security, that also needs some database parameters. I made it need just 1 database parameters location doing these stay in context.xml and referencing it in the others.

我编辑提到我正在使用 Shiro Security,这也需要一些数据库参数。我使它只需要 1 个数据库参数位置,将它们保留在 context.xml 中并在其他位置引用它。

1) Ant read context.xml

1)蚂蚁读取context.xml

Context.xml having

Context.xml 有

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <!-- Other stuff... -->

    <!-- Shiro's -->
    <Resource name="jdbc/postgres" auth="Container"
        type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
        url="jdbc:postgresql://url-to-db/database"
        username="user" password="pass" />
</Context>

did using in Ant build.xml

在 Ant build.xml 中使用

<xmlproperty file="/path/to/context.xml" keepRoot="false" semanticAttributes="true" includeSemanticAttribute="true" />

and then accessing it using

然后使用访问它

<target name="init-flyway">
    <property name="flyway.url" value="${Resource.url}" />
    <property name="flyway.user" value="${Resource.username}" />
    <property name="flyway.password" value="${Resource.password}" />
    <!-- stuff stuff stuff -->
</target>

2) persistence.xml read context.xml

2)persistence.xml 读取context.xml

It is possible to use context's datastore using this

可以使用上下文的数据存储使用

<non-jta-data-source>java:/comp/env/jdbc/postgres</non-jta-data-source>

So, I killed 3 database parameters to just 1.

因此,我将 3 个数据库参数删除为 1。

Thanks for the help!

谢谢您的帮助!

回答by Gireesh

If you are using Maven as the build system, you can use Maven filters to replace the values during build time.

如果您使用 Maven 作为构建系统,您可以使用 Maven 过滤器在构建期间替换值。

Or you can write a simple property placeholder replacement (which is internally used by spring itself)

或者你可以写一个简单的属性占位符替换(由spring本身内部使用)

Reference: https://stackoverflow.com/a/14724719/477435

参考:https: //stackoverflow.com/a/14724719/477435

回答by David Levesque

Instead of defining the properties inside persistence.xmlyou can define them in a standard properties file (key=value) and pass a Propertiesobject to the createEntityManagerFactory()method, e.g.:

persistence.xml您可以在标准属性文件(键=值)中定义它们并将Properties对象传递给createEntityManagerFactory()方法,而不是在内部定义属性,例如:

Properties props = new Properties();
props.load(new FileInputStream("/some/path/persistence.properties"));
EntityManagerFactory factory = Persistence.createEntityManagerFactory("appName", props);