HURRAY, the example is working!

But making the same changes to my PDE TestCases fails. I am pretty sure this is because of different class loaders.

Is it possible to also specify a distinct class loader for each entity class?

Background:
I am running in an OSGi environment in which the code is modularized into bundles. Each bundle has its own class loader. The EntityManager lives in bundle A that has class loader CA. The entity class lives in bundle B that has class loader CB. Further entities could live in bundle C with class loader CC. And so on... For now, the class loaders are already known when the the EntityManagerFactory properties need to be constructed.

Is there a way to do something like this?
  Map<String, String> properties = new HashMap<String, String>();
  properties.put( "openjpa.MetaDataFactory",
                  "jpa(Types=org.ex.Person:org.osgi.BundleLoader)");

Thanks in advance
Rüdiger

Pinaki Poddar wrote:
Hi,
   If the list of persistent classes are known *before* EntityManagerFactory
is created, then a possible
solution is as below:

public class TestDynamic extends TestCase {
        public void testDynamic() {
               // create a semicolon-separated list of persistent class
names
                Class[] classes = { Unenhanced.class};
                StringBuffer classNames = new StringBuffer();
                for (Class c : classes) {
                        if (classNames.length() > 0)
                                classNames.append(";");
                        classNames.append(c.getName());
                }

                Map<String, String> properties = new HashMap<String, String>();
                properties.put("openjpa.RuntimeUnenhancedClasses", "supported");
                properties.put("openjpa.ConnectionUserName", "sa");
                properties.put("openjpa.ConnectionPassword", "");
                properties.put("openjpa.ConnectionURL", 
"jdbc:mysql://localhost/test");
                properties.put("openjpa.ConnectionDriverName", 
"com.mysql.jdbc.Driver");

               // specify list of class names as a property
                properties.put("openjpa.MetaDataFactory", 
"jpa(Types="+classNames+")");
// allow table definitions on-the-fly properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
               // now create factory
                EntityManagerFactory factory =
Persistence.createEntityManagerFactory("test", properties);
                
                // create a EM to trigger dynamic class management
                EntityManager em = factory.createEntityManager();
                em.close();
                
// hence things should behave normally em = factory.createEntityManager();
                Unenhanced pc = new Unenhanced();
                em.getTransaction().begin();
                em.persist(pc);
                em.getTransaction().commit();
        }



Reply via email to