Hi All
In an effort to allow sharing of a connection pool across different 
configurations (serverSessions), I am trying to use Universal Connection 
Pool with Eclipselink. I am able to get the basic functionality working 
using something like below:
1. Create a PoolDataSource
    a. set the datasource parameters
2. set the PersistenceProvider using the following code:
    PersistenceProviderResolverHolder.setPersistenceProviderResolver(
                new MyPersistenceProviderResolver());    }
    ...
    static class MyPersistenceProviderResolver implements 
PersistenceProviderResolver {
        public List<PersistenceProvider> getPersistenceProviders() {
            List<PersistenceProvider> providers = new 
ArrayList<PersistenceProvider>();
            providers.add(new MyPersistenceProvider());
            return providers;
        }
        public void clearCachedProviders() {          
        }
    }
    ...
    static class MyPersistenceProvider implements PersistenceProvider {
        public EntityManagerFactory createContainerEntityManagerFactory(
            PersistenceUnitInfo info, @SuppressWarnings("rawtypes")Map 
map) {
            return null;
        }
        public EntityManagerFactory createEntityManagerFactory(String 
emName,
            @SuppressWarnings("rawtypes")Map map) {
            SEPersistenceUnitInfo puInfo = new SEPersistenceUnitInfo();
            URL noopURL = null;
            try {
                noopURL = new URL(null, "noop:", new URLStreamHandler() {
                    protected URLConnection openConnection(URL url) 
throws IOException {
                        return new URLConnection(url) {
                            public InputStream getInputStream() throws 
IOException {
                                return null;
                            }
                            public void connect() throws IOException {
                            }
                        };
                    }
                });
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            puInfo.setPersistenceUnitRootUrl(noopURL);
            EntityManagerSetupImpl entityManagerSetupImpl =
                new EntityManagerSetupImpl(PERSISTENCE_UNIT_NAME + 
Math.random(), PERSISTENCE_UNIT_NAME + Math.random());
            entityManagerSetupImpl.predeploy(puInfo, map);
            return new EntityManagerFactoryImpl(entityManagerSetupImpl, 
map);
        }
        public ProviderUtil getProviderUtil() {
            return null;
        }
    }
3. Create the configuration with the following types:
        EmpDep ed = new EmpDep();
        Order order = new Order();
    the Order constructor creates a serverSession which has a reference 
to a DynamicType for "Order" table.
    the EmpDep constructor creates a serverSession which has a reference 
to DynamicTypes for "Employee", "Department" tables and their relationships.
    Both these objects are connected to the same Datasource using
        properties.put(PersistenceUnitProperties.NON_JTA_DATASOURCE, 
datasource);
    These classes have a printAll() method which does a SELECT * on the 
tables. It acquires a client session to execute the query and then 
releases it.
   
4. Now I do the following
 
    order.printAll();
    ed.printAll();
5. *The above code flow goes through fine. But if I swap the order of 
initialization of the ed and order objects, I get the following exception*:
Query Key empinfo.depinfo
   Base jpatest.empinfo is not valid, or for a mapping type that does 
not support joining.
    at 
org.eclipse.persistence.exceptions.QueryException.mappingForExpressionDoesNotSupportJoining(QueryException.java:673)
    at 
org.eclipse.persistence.internal.queries.JoinedAttributeManager.prepareJoinExpression(JoinedAttributeManager.java:851)
To sum it up:
 A.
 EmpDep ed = new EmpDep();
 Order order = new Order();
 order.printAll();
 ed.printAll();
  works
 B.
  Order order = new Order();
  EmpDep ed = new EmpDep();
  order.printAll();
  ed.printAll();
  does not work
  C.
  EmpDep ed = new EmpDep();
  Order order = new Order();
  ed.printAll();
  order.printAll();
  does not work
  D.
  EmpDep ed = new EmpDep();
  Order order = new Order();
  order.printAll();
  ed.printAll();
  order.printAll(); // throws an error that we should log into the 
session first.
Any idea why this behavior with the third party datasource also?
--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
------------------------------------------------------------------------
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users