Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Problem using third-party datasource with Eclipselink

I think I have found the issue. My Entity Manager Factory object was a local variable. I made it a class member and it seems to work. Probably the emf object was being garbage collected.
My Bad...

Thanks anyways
Rohit

On 2/23/2011 9:23 PM, Tom Ware wrote:
Hi Rohit,

  Have you tried your code with a standard data source?  The exception does not initially appear to be data source related?

-Tom

Rohit Banga wrote:
  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

--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies

Back to the top