How to externalize properties from JPAs persistence.xml?

28,867

Solution 1

As an alternative to your current approach and since you're using Hibernate, you could use Hibernate to configure JPA by declaring a hibernate.cfg.xml file using the hibernate.ejb.cfgfile property, like this:

<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>

My understanding is that the hibernate.cfg.xml is just supposed to be on the classpath (so it could be outside the packaged archive).

References

Solution 2

Just found a an alleged way for EclipseLink users. There is "eclipselink.persistencexml" which has a default value of

public static final String ECLIPSELINK_PERSISTENCE_XML_DEFAULT = "META-INF/persistence.xml";

but it can't be overridden although the docs say it can be...

/**
 * 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.
 */

Solution 3

I used this mechanism, seems to work for most of the properties, had issues with non-jta-data-source.

http://www.eclipse.org/eclipselink/api/2.4/index.html?org/eclipse/persistence/config/PersistenceUnitProperties.html

Solution 4

If you are using Spring to manage and inject entity manager, then it is possible to implement org.springframework.orm.jpa.persistenceunit.PersistenceUnitPostProcessor and pass on external properties. I could successfully externalize all properties from persistence.xml using this.

Share:
28,867
stacker
Author by

stacker

Data Explorer English

Updated on February 12, 2020

Comments

  • stacker
    stacker over 4 years

    I would like to put some of the hibernate configuration in a property file to make it editable without build and deploy.

    I tried to solve my problem by following the instructions from Create JPA EntityManager without persistence.xml configuration file

    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>
    

    In the initialization code the application executes the following sequence, (which finds the properties),

    Properties props = new Properties();
    InputStream is = ClassLoader.getSystemResourceAsStream( "app.properties" );
    props.load( is );
    Persistence.createEntityManagerFactory( "pu", props );
    

    but fails with the error message:

     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
    

    Does anyone have an idea what could be wrong with my configuration?

    Versions: JBoss 4.3 Seam: 2.1.2

    EDIT:

    JBoss JNDI enlists "pu" as persistence unit:

    persistence.units:ear=app.ear,jar=app.jar,unitName=pu (class: org.hibernate.impl.SessionFactoryImpl)