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.
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.
The @Table annotation is optional.
@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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With