Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Logging Property Not Automatically Propagated to Client Session from Server Session

Hi Doug

The class org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory() uses org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.
The methods JPAInitilaizer.findPersistenceUnitInfo() and JPAInitializer.findPersistenceUnitInfoInArchives() suggest that the information is looked up in the Persistence XML. I managed to create Persistence units on the fly by writing a new PersistenceProvider implementation but wanted to avoid this as I wasn't sure that my Persistence Provider was complete in all respects. Is that what you are referring to?

Other than that if I continue to use the serverSession API as below, then I hope I will still be able to use SessionCustomizer, SessionEventAdapter if I need them at a later point of time.

Thanks
Rohit

On 6/1/2011 4:46 PM, Doug Clarke wrote:
Rohit,

It is possible to create EclipseLink persistence units on the fly without any XML. I need to search for the code sample but know there is some examples around. I know in the Dynamic Persistence work or 2.2 I had also written some.

Doug

On 2011-06-01, at 7:12 AM, Rohit Banga <rohit.banga@xxxxxxxxxx> wrote:

Hi All

The following code snippet worked for me:

    DatabaseLogin login = new DatabaseLogin();
    ...
    serverSession = new ServerSession(login);

    //    serverSession.setProperty(PersistenceUnitProperties.LOGGING_LOGGER, CustomLogger.class.getClass());
    //    does not work

    serverSession.setSessionLog(new CustomLogger());    // this works

    serverSession.login();
    emf = JpaHelper.createEntityManagerFactory(serverSession);
    dynamicHelper = new JPADynamicHelper(emf);


Thanks a lot Tom for helping me through this one.

I am unable to use the default PersistenceProvider as my persistence units are created dynamically.
I could have also had a more elaborate implementation of my custom PersistenceProvider. But for now serverSession APIs seem to be sufficient.

Thanks
Rohit

On 5/31/2011 10:24 PM, Tom Ware wrote:
Hi Rohit,

  The properties you are passing in are processed by EclipseLink as its PersistenceProvider class builds the EntityManagerFactoryImpl.

To use these settings when you are forgoing that process by creating your session and EntityManagerFactoryImpl, you will have to set the underlying properties.  (e.g. you will actually have to set an instance of your logger into the session)

  I suspect you are not seeing the functionality from many of the other properties either.

BTW: Weaving of non dynamic class will require use of our PersistenceProvider.

-Tom

Rohit Banga wrote:
  Hi Tom

The following code works for me:
I can get the program to work without PersistenceProvider.

    DatabaseLogin login = new DatabaseLogin();
    ...
    serverSession = new ServerSession(login);

    serverSession.setProperty(PersistenceUnitProperties.TARGET_DATABASE, ...);
    serverSession.setProperty(PersistenceUnitProperties.LOGGING_LEVEL, SessionLog.FINEST_LABEL);
    serverSession.setProperty(PersistenceUnitProperties.LOGGING_LOGGER, CustomLogger.class.getName());
    serverSession.setProperty(PersistenceUnitProperties.WEAVING, "true");
    serverSession.setProperty(PersistenceUnitProperties.WEAVING_FETCHGROUPS, "true");
    serverSession.setProperty(PersistenceUnitProperties.TARGET_SERVER, TargetServer.None);
    serverSession.setProperty(PersistenceUnitProperties.CLASSLOADER, CustomLogger.class.getClassLoader());

    serverSession.login();

    emf = JpaHelper.createEntityManagerFactory(serverSession);
    dynamicHelper = new JPADynamicHelper(emf);

I do see the logs on the standard output during initialization.
But after login, I do not see any logs being done by my CustomLogger.

Any idea how to fix this?

Thanks
Rohit

On 5/31/2011 8:21 PM, Tom Ware wrote:
Hi Rohit,

  The implementation of createEntityManagerFactory in the javax.persistence.Persistence class simply calls createEntityManagerFactory on each PersistenceProvider the resolver finds until one can provide a factory, so avoiding that call is a matter of calling createEntityManagerFactory() on EclipseLink's implementation.

  I am not sure what your requirements are related to multiple entity manager factories.   If you don't mind having the same backing-session, you should be able to do this by simply calling the createEntityManagerFactory method multiple times.  If you want different backing sessions, the "eclipselink.session-name" property can be specified with a different name each time you call that method.

  If you do not want a persistence.xml, you can use our JpaHelper class to create an EntityManagerFactory based on a session you have previously created. The key is that you need a session. (I am not really clear what your requirements are in this regard)

  EclipseLink also supports providing an alternate persistence.xml location and filename.  You can provide this using the "eclipselink.persistencexml" property passed in as part of the map argument to createEntityManagerFactory.

-Tom

Rohit Banga wrote:
  Hi Tom

I tried running my code with the default PersistenceProvider implementation. But my usecase requires multiple EntityManagerFactory's to be instantiated. If in the PersistenceProviderResolverHolder I specify
new PersistenceProvider() in place of new MyPersistenceProvider() then I cannot specify the name of the PersistenceUnit which is not able to located the specific Persistence Unit.

    emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME,
        properties);
    dynamicHelper = new JPADynamicHelper(emf);
    serverSession = (ServerSession) JpaHelper.getServerSession(emf);

Can I somehow do away with the PersistenceProviderResolverHolder while still using the default PersistenceProvider? I want to avoid using a persistence.xml but if that is the recommended way I will use that.

Thanks
Rohit

On 5/31/2011 7:06 PM, Tom Ware wrote:
Hi Rohit,

  I think you are only the 2nd person we have heard from on this group that was considering implementing their own provider.  As a result, we have not put alot of effort into providing that kind of example.

  There is quite alot of work done in our PersistenceProvider code.  If possible, it would likely be considerably easier to leverage that code.  What do you need to customize?

-Tom

Rohit Banga wrote:
  Hi Tom

Thanks for pointing out the insufficiency of the code.
Since I am not doing any customizations should I consider using org.eclipse.persistence.jpa.PersistenceProvider. Will that be a reasonable substitute?
Are there any examples / documentation available for creating Custom Persistence Providers. Most of the documentation I could find is about persistence.xml.

Thanks
Rohit

On 5/31/2011 6:40 PM, Tom Ware wrote:
Hi Rohit,

  To be honest, I am surprised such a sparse implementation of PersistenceProvider with such a sparsely populated instance of SEPersistenceUnitInfo works.  If you are implementing your own persistence provider you will definitely have to do more work with things like the classloader than the typical user.  As an initial step, it is probably a good idea to take a look at every property of PersistenceUnitInfo and make sure you set it correctly.

-Tom

Rohit Banga wrote:
  Hi Tom

Class.forName() does not throw the same exception.

I figured out another way to ensure that the Class Loader is picked up correctly.

      SEPersistenceUnitInfo puInfo = new SEPersistenceUnitInfo();
      puInfo.setClassLoader(MyLogger.class.getClassLoader());


EntityManagerSetupImpl.predeploy() contains the following line to merge the properties:

            Map predeployProperties = mergeMaps(extendedProperties, persistenceUnitInfo.getProperties());


The properties member variable of SEPersistenceUnitInfo and the actual member variables like classLoader are not in sync with each other.
Though the setClassLoader method registers the class loader a call to setProperties() on the SEPersistenceUnitInfo does not populate the classLoader member variable.
As a result the realClassLoader field in EntityManagerSetupImpl.predeploy() is null.

      puInfo.setClassLoader(MyLogger.class.getClassLoader());

I am not sure whether my implementation of PersistenceProvider is correct or not. Can you please see if I am missing something else in MyPersistenceProvider code I sent earlier?

Thanks
Rohit

On 5/30/2011 9:19 PM, Tom Ware wrote:
My best guess about your logger is that the string you are passing in isn't formatted correctly (likely due to the fact that it is an inner class).  To debug:

- try using a non-inner class to see if you're getting the right loader
- Ensure you can do a Class.forName() using that string to see if the string is correct

-Tom

Rohit Banga wrote:
  Hi Tom

Yes that was a slip in my test code. Sorry about that. So the properties are inherited by default.

Other than that instead of using SessionCustomizer I am planning to use "eclipselink.logging.logger" to configure my CustomLogger. But I am getting Class not found exceptions. The CustomLogger is a public static class nested inside the main class. Any ideas what could be causing this? I don't know what to specify in the class loader property. I tried setting it  to System.getProperty("|java.system.class.loader|"). does not work.

On 5/30/2011 8:47 PM, Tom Ware wrote:
Hi Rohit,

  The only call I see to setLogLevel in your example is on line 73.  It sets the log level on the clientSession.  Am I missing something?

  A clientSession will have the same logger as the server session that created it, so any logging settings should be the same between the sessions.

  SessionCustomizers don't really make sense on ClientSession since the things you are likely to set in them are all handled by the server session.

  Is there some other setting that is causing you problems?

-Tom

Rohit Banga wrote:
  Hi All

I have a small question. I have attached a sample program to make it easy to see the problem.

I have set the LogLevel property on the ServerSesssion. However if I do not explicitly set the LogLevel property on the clientSession, the logs for the query execution are not available on the console. I want a way such that any property specified on the server session, say SessionCustomizer, Log Level etc. is also available on the client session automatically. Can anyone please tell me how to do that using the sample code provided?

-- 
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
_______________________________________________
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

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

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

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

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

--
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