我想读取persistence.xml文件中的环境变量。读取persistence.xml文件中的环境变量
想法是我不希望我的数据库详细信息从属性文件中读取,因为有一个获取属性文件覆盖的变化。而我想从环境变量中读取详细信息。
有什么办法可以达到这个标准。
Iam使用Spring 3我的独立应用程序将部署在unix机器上。
我想读取persistence.xml文件中的环境变量。读取persistence.xml文件中的环境变量
想法是我不希望我的数据库详细信息从属性文件中读取,因为有一个获取属性文件覆盖的变化。而我想从环境变量中读取详细信息。
有什么办法可以达到这个标准。
Iam使用Spring 3我的独立应用程序将部署在unix机器上。
可以通过提供一个地图(见this)更新持久性单元的属性。
便利,环境变量可以作为一个映射(见this)进行检索。
把这两者结合起来,你可以动态地更新你的持久单元环境变量的属性。
编辑:简单的例子...
的persistence.xml ...
<persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
<provider>
oracle.toplink.essentials.PersistenceProvider
</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="toplink.logging.level" value="INFO"/>
<property name="toplink.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
<property name="toplink.jdbc.url" value="jdbc:oracle:thin:@myhost:l521:MYSID"/>
<property name="toplink.jdbc.password" value="tiger"/>
<property name="toplink.jdbc.user" value="scott"/>
</properties>
</persistence-unit>
代码更新persistence.xml中 “默认” 单元的环境变量...
Map<String, String> env = System.getenv();
Map<String, Object> configOverrides = new HashMap<String, Object>();
for (String envName : env.keySet()) {
if (envName.contains("DB_USER")) {
configOverrides.put("toplink.jdbc.user", env.get(envName)));
}
// You can put more code in here to populate configOverrides...
}
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("default", configOverrides);
我不认为这将覆盖通过注射创建的EMs。更糟糕的是,我认为通过EMF创建的EM只能是EXTENDED(例如等同于与EXTENDED相对的注解@PersistenceContext(type = PersistenceContextType.TRANSACTION)),因此如果需要事务EM,则必须使用注入。
我想知道,如果可能的身体在运行时重写persistence.xml文件。问题之一是,重写文件的能力(权限,能够在META-INF中得到它),第二,在JPA首次打开之前重写它(我首先想到的是一个注入的EM字段实际上是由应用程序代码引用的)
不应在persistence.xml中定义像hostname这样的数据库详细信息。使用JNDI查找并在您的应用程序服务器中定义具体的数据库参数... – home 2012-01-12 14:41:54
嗨,对不起,我没有在这里使用任何应用程序服务器,我正在运行独立的应用程序,这就是为什么我需要在persistence.xml文件中硬编码数据库的详细信息。 – Ran 2012-01-12 14:49:50
是否想从环境变量或persistence.xml中获取数据库详细信息?这看起来像你说你想从两者中得到它们,但它不完全清楚...... – 2012-01-12 14:56:48