2012-01-12 51 views
6

Quiero leer las variables de entorno dentro del archivo persistence.xml.Leer variables de entorno en el archivo persistence.xml

La idea es que no quiero que los datos de mi base de datos se lean desde el archivo de propiedades ya que hay un cambio en la anulación del archivo de propiedades. En cambio, quiero leer los detalles de las variables de entorno.

¿Hay alguna manera de cumplir este criterio?

Iam using Spring 3 mi aplicación independiente se implementará en la máquina Unix.

+2

Los detalles de la base de datos como nombre de host no se deben definir en su persistence.xml. Use búsquedas JNDI y defina parámetros concretos de la base de datos en su servidor de aplicaciones ... – home

+0

Hola, lamento mencionar que no estoy usando ningún servidor de aplicaciones aquí, estoy ejecutando una aplicación independiente, es por eso que necesito codificar los detalles de la base de datos en el archivo persistence.xml . – Ran

+0

¿Desea obtener los detalles de la base de datos de las variables de entorno o de persistence.xml? Parece que dices que quieres obtenerlos de ambos, pero no está del todo claro ... –

Respuesta

5

Puede actualizar las propiedades en una unidad de persistencia proporcionando un Mapa (consulte this).

Convenientemente, las variables de entorno se pueden recuperar como un mapa (consulte this).

Ponga las dos juntas y puede actualizar dinámicamente las propiedades en su unidad de persistencia con variables de entorno.

EDIT: ejemplo sencillo ...

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> 

código que las actualizaciones persistence.xml unidad de "default" con las variables de entorno ...

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

Hola Zack, no estoy seguro de cómo puedo proporcionar un mapa para persistence.xml. Puedes proporcionar un código de muestra para esto. – Ran

+0

Ejemplo cargado: he encontrado buena información buscando en Google "persistencia".xml " –

+0

Hola Zack, el código anterior me obliga a anular las variables env cada vez que creo el objeto EntityManagerFactory. En ese caso, si estoy usando este EntityManagerFactory en 10 clases cada vez que necesito cambiar. – Ran

1

No creo que esto cubra los EM creados mediante inyección. Peor aún, creo que los EM creados a través de EMF solo se pueden EXTENDER (por ejemplo, equivalentes a la anotación @PersistenceContext (type = PersistenceContextType.TRANSACTION) opuesta a EXTENDED) de modo que si uno requiere una transacción EM, se debe usar la inyección.

Me pregunto si es posible volver a escribir físicamente el archivo persistence.xml en tiempo de ejecución. Problema uno, capacidad de reescribir el archivo (permisos, poder acceder a él en META-INF, etc.), y segundo, reescribirlo antes de que sea abierto por primera vez por JPA (lo que creo que ocurre la primera vez que se inyecta un EM el campo es referenciado por el código de la aplicación)

Cuestiones relacionadas