2012-01-12 6 views
6

Я хочу прочитать переменные окружения в файле persistence.xml.Чтение переменных среды в файле persistence.xml

Идея заключается в том, что я не хочу, чтобы данные моей базы данных читались из файла свойств, так как происходит изменение переопределения файла свойств. Вместо этого я хочу читать данные из переменных среды.

Есть ли способ достижения этих критериев.

Iam using Spring 3 мое автономное приложение будет развернуто в unix-машине.

+2

Данные о базах данных, такие как имя хоста, не должны определяться в вашем файле persistence.xml. Используйте JNDI-запросы и определите конкретные параметры базы данных на сервере приложений ... – home

+0

Привет, Извините, что я не использую сервер приложений здесь, я запускаю автономное приложение, поэтому мне нужно жестко настроить данные базы данных в файле persistence.xml , – Ran

+0

Вы хотите получить данные базы данных из переменных окружения или из persistence.xml? Это похоже на то, что вы говорите, что хотите получить их от обоих, но это не совсем понятно ... –

ответ

5

Вы можете обновить свойства в единице сохранения, предоставив карту (см. this).

Удобно, переменные окружения можно получить в виде Карты (см. this).

Поместите эти два вместе, и вы можете динамически обновлять свойства в своем устройстве персистентности с помощью переменных окружения.

EDIT: простой пример ...

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

+0

Приведенный пример - я нашел какую-то хорошую информацию по поиску googling.xml " –

+0

Привет Зак, приведенный выше код требует от меня переопределять переменные env каждый раз, когда я создаю объект EntityManagerFactory. В этом случае, если я использую этот EntityManagerFactory в 10 классах каждый раз, когда мне нужно изменить. – Ran

1

Я не думаю, что это будет охватывать EM, созданные с помощью инъекции. Хуже того, я думаю, что EM, созданные через EMF, могут быть расширены (например, эквивалент аннотации @PersistenceContext (тип = PersistenceContextType.TRANSACTION), противоположный EXTENDED), так что если требуется транзакция EM, нужно использовать инъекцию.

Мне интересно, возможно ли его физически переписать файл persistence.xml во время выполнения. Проблема заключается в возможности переписать файл (разрешения, возможность доступа к нему в META-INF и т. Д.), А во-вторых, переписать его перед его первым открытием JPA (который, как я думаю, происходит при первом вводе EM поле на самом деле ссылается кодом приложения)