Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to externalize properties from JPAs persistence.xml?

Tags:

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) 
like image 694
stacker Avatar asked Oct 14 '10 16:10

stacker


People also ask

Where should I put the persistence xml?

xml should be put in the EJB JAR's META-INF directory. If you package the persistence unit as a set of classes in a WAR file, persistence. xml should be located in the WAR file's WEB-INF/classes/META-INF directory.

How does persistence xml work?

The persistence. xml file must define a persistence-unit with a unique name in the current scoped classloader. The provider attribute specifies the underlying implementation of the JPA EntityManager. In JBoss AS, the default and only supported / recommended JPA provider is Hibernate.

Can we have multiple persistence xml?

The Java Persistence API allows you to define multiple persistence units, each of which can map to a separate database.


1 Answers

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

  • Hibernate Entity Manager Reference Guide
    • Table 2.1. Hibernate Entity Manager specific properties
like image 85
Pascal Thivent Avatar answered Sep 18 '22 12:09

Pascal Thivent