java - ¿Cómo externalizar las propiedades de JPAs persistence.xml?
hibernate java-ee (4)
Me gustaría poner algo de la configuración de hibernación en un archivo de propiedades para que sea editable sin compilación e implementación.
Traté de resolver mi problema siguiendo las instrucciones de Create JPA EntityManager sin el archivo de configuración persistence.xml
app.properties:
hibernate.show_sql=true
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=validate
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.default_schema=myschema
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Persistence deployment descriptor for dev profile -->
<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="pu">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/appDatasource</jta-data-source>
<properties>
<property name="jboss.entity.manager.factory.jndi.name" value="java:/appEntityManagerFactory"/>
</properties>
</persistence-unit>
</persistence>
En el código de inicialización, la aplicación ejecuta la siguiente secuencia, (que encuentra las propiedades),
Properties props = new Properties();
InputStream is = ClassLoader.getSystemResourceAsStream( "app.properties" );
props.load( is );
Persistence.createEntityManagerFactory( "pu", props );
pero falla con el mensaje de error:
INFO [SessionFactoryImpl] building session factory
INFO [SessionFactoryObjectFactory] Not binding factory to JNDI, no JNDI name configured
ERROR [STDERR] javax.persistence.PersistenceException: [PersistenceUnit: pu] Unable to build EntityManagerFactory
¿Alguien tiene una idea de lo que podría estar mal con mi configuración?
Versiones: JBoss 4.3 Seam: 2.1.2
EDITAR:
JBoss JNDI alista "pu" como unidad de persistencia:
persistence.units:ear=app.ear,jar=app.jar,unitName=pu (class: org.hibernate.impl.SessionFactoryImpl)
Acabo de encontrar una forma supuesta para los usuarios de EclipseLink. Hay " eclipselink.persistencexml " que tiene un valor predeterminado de
public static final String ECLIPSELINK_PERSISTENCE_XML_DEFAULT = "META-INF/persistence.xml";
pero no puede ser anulado aunque los documentos dicen que puede ser ...
/**
* The <code>"eclipselink.persistencexml"</code> property specifies the full
* resource name to look for the persistence XML files in. If not specified
* the default value defined by {@link #ECLIPSELINK_PERSISTENCE_XML_DEFAULT}
* will be used.
* <p>
* IMPORTANT: For now this property is used for the canonical model
* generator but it can later be used as a system property for customizing
* weaving and application bootstrap usage.
* <p>
* This property is only used by EclipseLink when it is locating the
* configuration file. When used within an EJB/Spring container in container
* managed mode the locating and reading of this file is done by the
* container and will not use this configuration.
*/
Como alternativa a su enfoque actual y dado que está utilizando Hibernate, puede usar Hibernate para configurar JPA al declarar un archivo hibernate.cfg.xml
usando la propiedad hibernate.ejb.cfgfile
, como esta:
<persistence>
<persistence-unit name="manager1" transaction-type="JTA">
<jta-data-source>java:/DefaultDS</jta-data-source>
<properties>
<property name="hibernate.ejb.cfgfile" value="/hibernate.cfg.xml"/>
</properties>
</persistence-unit>
</persistence>
Según entiendo, se supone que hibernate.cfg.xml
está en el classpath (por lo que podría estar fuera del archivo empaquetado).
Referencias
- Guía de referencia de Hibernate Entity Manager
Si está utilizando Spring para administrar e inyectar el administrador de entidades, entonces es posible implementar org.springframework.orm.jpa.persistenceunit.PersistenceUnitPostProcessor y pasar propiedades externas. Pude externalizar todas las propiedades de persistence.xml usando esto.
Usé este mecanismo, parece que funciona para la mayoría de las propiedades, tuve problemas con la fuente de datos no-jta.