2012-01-12 38 views
6

我想读取persistence.xml文件中的环境变量。读取persistence.xml文件中的环境变量

想法是我不希望我的数据库详细信息从属性文件中读取,因为有一个获取属性文件覆盖的变化。而我想从环境变量中读取详细信息。

有什么办法可以达到这个标准。

Iam使用Spring 3我的独立应用程序将部署在unix机器上。

+2

不应在persistence.xml中定义像hostname这样的数据库详细信息。使用JNDI查找并在您的应用程序服务器中定义具体的数据库参数... – home 2012-01-12 14:41:54

+0

嗨,对不起,我没有在这里使用任何应用程序服务器,我正在运行独立的应用程序,这就是为什么我需要在persistence.xml文件中硬编码数据库的详细信息。 – Ran 2012-01-12 14:49:50

+0

是否想从环境变量或persistence.xml中获取数据库详细信息?这看起来像你说你想从两者中得到它们,但它不完全清楚...... – 2012-01-12 14:56:48

回答

5

可以通过提供一个地图(见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); 
+0

嗨扎克,我不知道我怎么能提供映射到persistence.xml。你可以提供一些示例代码。 – Ran 2012-01-13 07:00:11

+0

已上传示例 - 我一直在通过Google搜索“持久性”找到一些很好的信息。xml“ – 2012-01-13 10:48:44

+0

嗨Zack,上面的代码要求我每次创建EntityManagerFactory对象时都要覆盖env变量。在这种情况下,如果我在10个类中使用此EntityManagerFactory,则需要更改每个位置。 – Ran 2012-01-13 11:46:55

1

我不认为这将覆盖通过注射创建的EMs。更糟糕的是,我认为通过EMF创建的EM只能是EXTENDED(例如等同于与EXTENDED相对的注解@PersistenceContext(type = PersistenceContextType.TRANSACTION)),因此如果需要事务EM,则必须使用注入。

我想知道,如果可能的身体在运行时重写persistence.xml文件。问题之一是,重写文件的能力(权限,能够在META-INF中得到它),第二,在JPA首次打开之前重写它(我首先想到的是一个注入的EM字段实际上是由应用程序代码引用的)