Hi Teemu, 
     
    On 03/02/2011 2:30 PM, teemu kanstren wrote:
    Hello Shaun & Tom,
       
       
       Thanks for your replies. I noted Gemini in my search but did
        not pursue that further at that time. This is because JPA is
        just one technology for me in building my software and I would
        hope that it would not force me into a specific container
        implementation. I think that's what a "standard" like JPA should
        enable. However, I will try to keep an eye on this stuff since
        it is interesting. 
       
       
       I am curious about the OSGI Java EE specifications you
        mention. Can you point me to some links for further information
        on what they are? 
     
    The document is the "OSGi Service Platform Release 4 Version 4.2
    Enterprise Specification" which you can download from: http://www.osgi.org/Download/Release4V42
    
       
       
       Is the JPA-PersistenceUnit header specific to EclipseLink?  
     
    Yes but in the spec the standard and portable header as supported by
    Gemin JPA is "Meta-Persistence" (note you don't provide PU names but
    rather persistence descriptor files--e.g. persistence.xml). 
    
      And is the classloader property also EclipseLink specific?
        That is are they supported in general in OSGI containers/JPA
        providers or just EclipseLink?  
     
    This is an EclipseLink feature but isn't always necessary.  
    
      I never noticed those before,  thanks for clearing that up.
        At least now I know how to make one JPA provider work in a more
        "official way" if my current hack fails :) Maybe this stuff
        could find a more explicit mention in the docs as well. 
     
     
    The OSGi spec as implemented by Gemini JPA is the "official way"
    which is why Tom and I are gently pushing you in that direction. ;-) 
     
        Shaun 
    
       
       
      Teemu 
        
        2011/2/3 Shaun Smith  <shaun.smith@xxxxxxxxxx>
          
             Hi Teemu, 
              
              As Tom points out Gemini JPA will deliver OSGi compliant
              JPA and that is where the future lies. 
               
              However the current EclipseLink support for JPA in OSGi is
              not all that different from the OSGi spec and was
              certainly drawn upon when the spec was being authored.  As
              you suggest, there are lots of "tricks behind the scenes"
              to make JPA work in OSGi and EclipseLink is doing them.
              :-)  If you follow the instructions on the examples you'll
              see what you have to do--which isn't all that much.  The
              key thing is declaring the JPA-PersistenceUnits header in
              your bundle containing the persistence.xml.  EclipseLink
              locates persistence units (declared in persistence.xml) in
              bundles using this header.   In the OSGi spec this header
              is "Meta-Persistence" and is used slightly differently but
              the intent is the same.
               
              Also, you can indeed pass a classloader to
              EntityManagerFactory.createEntityManagerFactory and this
              classloader will be used to resolve classes and metadata
              but the persistence.xml *must* be declared using the
              JPA-PersistenceUnit header.  From  http://wiki.eclipse.org/EclipseLink/Examples/OSGi/Equinox_Byte_Code_Weaving:
              
               
                  import org.eclipse.persistence.config.PersistenceUnitProperties;
...
Map<String,Object> properties = new HashMap<String, Object>();
properties.put(PersistenceUnitProperties.CLASSLOADER, this.getClass().getClassLoader());
emf = Persistence.createEntityManagerFactory("comics", properties);
                This example also demonstrates how to run
              outside Eclipse PDE. 
               
              Hope this helps,  
               
                   Shaun
               
                
                  
                  On 03/02/2011 9:10 AM, Tom Ware wrote:
                   Hi Teemu,  
                     
                      Have you had a look at the Eclipse Gemini
                    project?  It will be the Reference Implementation
                    for the OSGi Java EE specifications.  
                     
                    http://www.eclipse.org/gemini/
                     
                     
                      There is a sub-project for JPA support.  The
                    documentation is sparse at the moment, but the
                    mailing lists and newsgroups have pretty good
                    response are are likely the best way to get advice
                    about how to get started.  
                     
                      Since this project is based on the actual
                    specification, I suspect that JPA providers that
                    want to provide OSGi services will migrate to work
                    based on Gemini.  
                     
                    -Tom  
                     
                    teemu kanstren wrote:  
                    Dear all,  
                       
                       I have been trying to get my OSGI stuff to work
                      with using JPA. As I am sure many here know, I
                      need to create the EntityManagerFactory with 
                      Persistence.createEntityManagerFactory("my-factory").
                      Now, behind the scenes (am I supposed to read the
                      sourcecode of the libraries as well? :)) this
                      loads the persistence.xml from the META-INF
                      directory on the classpath. With OSGI this always
                      gives me the error
                      "javax.persistence.PersistenceException: No
                      Persistence provider for EntityManager named
                      my-factory". After plenty of googling I came up
                      with the reason that the persistence.xml is loaded
                      using ThreadContext classloader, which in OSGI
                      naturally fails. Reading up on it I also found
                      only suggestions to use EclipseLink since it is
                      "the only one build for OSGI and the JPA RI". Yet
                      I get the same errors with it as well.  
                       
                       The only solution (after looong debugging
                      sessions) I found that would work is the one given
                      here:http://lsd.luminis.nl/jpa-persistence-in-osgi-with-openjpa/.
                      That is, to set the threadcontext classloader
                      before call to createEntityManagerFactory and
                      reset it after. I use Apache Felix as the OSGI
                      container and I tried with both Hibernate JPA and
                      EclipseLink JPA. Same problem every time, yet
                      outside OSGI it all works perfectly (running the
                      same code with JUnit). So, given that EclipseLink
                      is the JPA RI and targets an OSGI environment,
                      maybe someone can give me some answers here. My
                      questions  
                       
                      - Why is there no option in
                      Persistence.createEntityManagerFactory() to
                      provide your own classloader to be used in loading
                      of resources?  
                       
                      - Why is the only error message you can get for
                      this the "javax.persistence.PersistenceException:
                      No Persistence provider for EntityManager named
                      my-factory"? No mention of "unable to find
                      persistence.xml in classpath which is..." or
                      "using classloaders..." or whatever. Just "unable
                      to find" is a pretty bad message since it should
                      know quite a bit more about why it is not able to
                      find it (like missing persistence.xml for some
                      reason).  
                       
                      Using the trick in the link above it all works
                      fine. The only difference with "for OSGI" in
                      EclipseLink vs Hibernate I see is that I need to
                      import/export some stuff myself. Not much of an
                      achievement considering how cryptic it is to get
                      it working at all. Am I missing something?  
                       
                      Maybe there is some magic trick I miss since on
                      the EclipseLink documentation such as http://wiki.eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE
                      it all seems to be oh so easy. Or maybe Eclipse
                      does some tricks behind the scenes? Anyway, I was
                      left thinking you can only run it inside Eclipse
                      as this is what is always used in the docs.  
                       
                      To end more positively, thanks for all the efforts
                      on JPA. Once I learn it, and when it works, it is
                      nice enough :)  
                       
                      Teemu  
                       
                       
                       
                      ------------------------------------------------------------------------
                       
                       
                      _______________________________________________  
                      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
                     
                   
                  
                 
               
              
                --  
                   
                  Shaun Smith | Principal
                    Product Manager 
                    Phone: +1.905.502.3094 | Mobile: +1.416.558.6244  
                    Oracle Fusion
                    Middleware, TopLink 
                    ORACLE Canada | 110 Matheson Boulevard West, Suite
                    100, Mississauga, Ontario | L5R 3P4 
                    Oracle is committed to developing
                    practices and products that help protect the
                    environment  
               
             
            _______________________________________________ 
            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
     
     
    --  
       
      Shaun Smith | Principal Product Manager 
        Phone: +1.905.502.3094 | Mobile: +1.416.558.6244
         
        Oracle Fusion Middleware, TopLink 
        ORACLE Canada | 110 Matheson Boulevard West, Suite 100,
        Mississauga, Ontario | L5R 3P4
      
       
      Oracle is committed to developing practices and
        products that help protect the environment
      
     
  
 |