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 
      
      
         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  
           
         
       
      
        
       
     
     
    --  
      Thanks and Regards
       
      Rohit Banga
       
      Member Technical Staff
       
      Oracle Server Technologies
       
     
  
 |