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
persistence.xml to import database parameters values from .properties file
提问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
回答by David Levesque
Instead of defining the properties inside persistence.xml
you can define them in a standard properties file (key=value) and pass a Properties
object 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);