Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding entity classes dynamically at runtime

Tags:

java

jpa

I have this requirement to add entity classes to the persistence unit at runtime rather than specifying all of them in the persistence.xml. Can someone help me with the same?

I am aware that Hibernate has its own mechanism of doing the same using:

AnnotationConfiguration.addAnnotatedClass(Class), etc - You can also add hibernate config (*.hbm.xml) files programmatically.

The requirement is that without restarting the app server, I should be able to keep adding entity classes / their config (mapping) files to the persistence unit dynamically.

But the solution to programmatically add entity classes / configuration files at runtime to the persistence unit should not be specific to a JPA implementation.

like image 446
user1090154 Avatar asked Dec 09 '11 16:12

user1090154


People also ask

Can we extend entity class in Java?

Entities support class inheritance, polymorphic associations, and polymorphic queries. Entity classes can extend non-entity classes, and non-entity classes can extend entity classes. Entity classes can be both abstract and concrete.

Is @entity required?

The @Table annotation is optional.

What is hibernate entity class?

@Entity annotation marks this class as an entity. @Table annotation specifies the table name where data of this entity is to be persisted. If you don't use @Table annotation, hibernate will use the class name as the table name by default.


1 Answers

JPA doesn't offer this feature yet. Here are three options you can check out :

  • Programmatically loading Entity classes with JPA 2.0?
    This question on SO is similar to yours. An answer reports that it feasible with Spring.

  • JPA 2.0: Adding entity classes to PersistenceUnit *from different jar* automatically
    Good pointers are given here.

  • Last but not least, a simple work around :
    1. Generate a persistence.xml on the fly (simple XML file creation) with a new persistence unit.
    2. Add persistence file to classpath dynamically (URLCLassLoader)
    3. Ask PersistenceProvider to load new persistence unit (createEntityManagerFactory)

EDIT:

If the JPA provider is Hibernate, since Hibernate 4.0, it's possible to pass directly entities to this JPA provider without declaring them in the persistence.xml file. Hibernate will handle the entities on the fly.

EDIT:

Here is a sample configuration of JPA 2.1 + Hibernate 4.3.7.Final without declaring any entities :

META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8" ?> <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"     version="2.1">      <persistence-unit name="my-persistence-unit"         transaction-type="RESOURCE_LOCAL">         <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>         <properties>             <!-- Database Properties -->             <property name="javax.persistence.jdbc.url"                 value="jdbc:postgresql://localhost:5432/my-database" />             <property name="javax.persistence.jdbc.user" value="login" />             <property name="javax.persistence.jdbc.password" value="password" />              <!-- Hibernate Properties -->             <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />             <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />             <property name="hibernate.default_schema" value="public" />             <property name="hibernate.hbm2ddl.auto" value="update" />             <property name="hibernate.show_sql" value="false" />             <property name="hibernate.format_sql" value="true" />              <!-- Connection Pool -->             <property name="hibernate.c3p0.min_size" value="5" />             <property name="hibernate.c3p0.max_size" value="20" />             <property name="hibernate.c3p0.timeout" value="500" />             <property name="hibernate.c3p0.max_statements" value="50" />             <property name="hibernate.c3p0.idle_test_period" value="2000" />         </properties>     </persistence-unit>  </persistence> 

References

  • JPA 2.1 Specs : 8.2 Persistence Unit Packaging
  • JPA 2.1 Specs : 8.2.1.6 mapping-file, jar-file, class, exclude-unlisted-classes
like image 79
Stephan Avatar answered Sep 19 '22 20:09

Stephan