Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JPA 2.0: Adding entity classes to PersistenceUnit *from different jar* automatically

I have a maven-built CDI-based Java SE app, which has a core module, and other modules.
Core has the persistence.xml and some entities. Modules have additional entities.

How can I add the entities to the spotlight of the persistence unit?

I have read Hibernate manual, http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/configuration.html#setup-configuration-packaging

I have also seen these SO questions

  • How can I merge / extend persistence units from different JARs?
  • define jpa entity classes outside of persistence.xml
  • Programmatically loading Entity classes with JPA 2.0?

I am looking for a solution where Hibernate would scan for all loaded classes, or, would pick up some config file form the other jars (like e.g. CDI does with beans.xml).

My app does not use Spring. I don't insist on portability - I'll stick with Hibernate.

  • Is there some such solution?
  • Is there's a way to create a PU from persistence.xml and add classes to it programmatically?
  • Can I add @Entity classes to EntityManagerFactory after it was created?

Update: I found in org.​hibernate.​ejb.​Ejb3Configuration:

public Ejb3Configuration configure(String persistenceUnitName, Map integration)   

http://docs.jboss.org/hibernate/entitymanager/3.6/javadocs/

like image 383
Ondra Žižka Avatar asked Jun 17 '11 02:06

Ondra Žižka


2 Answers

There are several way to solve it:

  1. As described in Do I need <class> elements in persistence.xml?, you can set hibernate.archive.autodetection property and Hibernate should be able to look up all annotated classes from classpath. However, that's not JPA spec compliant.

  2. If you are using Spring, from Spring 3.1.2 (or probably even a bit earlier), in LocalContainerEntityManagerFactoryBean, you can define packageToScan which will ask LocalContainerEntityManagerFactoryBean to scan in classpath to find all annotated classes. Again, not JPA spec compliant.

  3. I was using Maven as build tools. Years before, I have written a little plugin which will generate persistence.xml during build process. The plugin will scan from build classpath to find out all annotated classes, and list them in the generated persistence.xml. This is most tedious but the result is JPA spec compliant. One drawback (which does not apply to most people I believe) is the lookup happens in build-time, not runtime. That means if you are having an application for which entities JARs are provided only at deploy/runtime but not build time, this approach is not going to work.

like image 78
Adrian Shum Avatar answered Oct 04 '22 12:10

Adrian Shum


Ejb3Configuration has been removed in 4.3.0. If you don't want to create a Hibernate's Integrator, you can use the property hibernate.ejb.loaded.classes.

properties.put(org.hibernate.jpa.AvailableSettings.LOADED_CLASSES, entities); Persistence.createEntityManagerFactory("persistence-unit", properties); 

Where entities is a List<Class> of entity classes.

like image 26
Ignacio Baca Avatar answered Oct 04 '22 14:10

Ignacio Baca