java hibernate jpa java-ee seam

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


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.