views:

328

answers:

2

With Hibernate you can load your Entity classes as:

sessionFactory = new AnnotationConfiguration()
                    .addPackage("test.animals")
                    .addAnnotatedClass(Flight.class)
                    .addAnnotatedClass(Sky.class)
                    .addAnnotatedClass(Person.class)
                    .addAnnotatedClass(Dog.class);

Is there a way to do the same thing - programmatically loading your Entity classes - in a JPA 2.0 compliant way?

The reason for this question is because I'd like to dynamically load my Entity classes, thus not nessecarily programmatically...

+1  A: 

I don't think there is such option - JPA supports scanning the classpath for entities or explicitly listing the entity classes in the persistence.xml. Since you're using hibernate as the persistence provider however you can always resort to hibernate code. Have a look at the HibernateEntityManager and HibernateEntityManagerFactory classes. You can cast entity manager factories and entity managers to them and do the usual hibernate stuff.

Bozhidar Batsov
Well, to be honest I'm actually using EclipseLink-2.0.2. I'll look into the classpath scanning, as it sounds promising. Do you have any idea whether or not that would work with bytecode modifications (before creating the EntityManager) with libraries such as Javassist?
Pepijn
+1  A: 

Is there a way to do the same thing - programmatically loading your Entity classes - in a JPA 2.0 compliant way?

No, this is not supported by JPA so you'll have to do this in a provider specific way. James Sutherland described the process for EclipseLink in this thread like this:

You can access the EclipseLink ServerSession from the EntityManagerFactoryImpl (getServerSession()), and use its' addDescriptor(ClassDescriptor) or addDescriptors() API to add EclipseLink ClassDescriptor. You will need to build the ClassDescriptor meta-data objects directly yourself (or use the Mapping Workbench to create them), as loading from JPA annotations or orm.xml would be more difficult.

Also have a look at this more recent thread for more code sample (the API looks like a bit verbose).

References

Pascal Thivent
Doesn't this defeat the whole purpose of JPA? It gives you a lot of control, but at the cost of having to do *absolutely everything* manually. Or am I seeing this the wrong way?
Pepijn
@Dennetik Somehow, yes. But I don't think EclipseLink has something as succinct as Hibernate. And I'm not even sure where to put the weaving step if you want lazy ToOne. In other words, I'm not totally sure of what you'd like to do but I have the feeling that JPA might not be appropriate.
Pascal Thivent