1 2 Previous Next 16 Replies Latest reply: Nov 23, 2008 9:32 PM by 612864 RSS

    howto use JNDI datasource with TopLink JPA in a SE environment (tomcat 5)?

    567350
      Hi,

      we are using TopLink JPA for webapps running on Tomcat 5.5 in a Java SE environment. We have the requirement to use the connection pool provided by tomcat, which provides the datasource via JNDI to the application.

      If I configure a "non-jta-datasource" in persistence.xml:

      <persistence-unit name="plc_webPU" transaction-type="RESOURCE_LOCAL">
      <provider>
      oracle.toplink.essentials.PersistenceProvider
      </provider>
      <non-jta-data-source>jdbc/DatasourceTest</non-jta-data-source>
      ...classes list ...
      </persistence-unit>

      we always the the following error:

      Caused by: Exception [TOPLINK-7060] (Oracle TopLink Essentials - 2.0 (Build b41-beta2 (03/30/2007))): oracle.toplink.essentials.exceptions.ValidationException
      Exception Description: Cannot acquire data source [jdbc/DatasourceTest].
      Internal Exception: javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
           at oracle.toplink.essentials.exceptions.ValidationException.cannotAcquireDataSource(ValidationException.java:358)
           at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:120)
           at oracle.toplink.essentials.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:170)
           at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:537)
           at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:206)
           at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:212)
           ... 55 more
      Caused by: javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
           at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
           at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
           at org.apache.naming.SelectorContext.lookup(SelectorContext.java:121)
           at javax.naming.InitialContext.lookup(InitialContext.java:355)
           at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:114)
           ... 59 more

      Accessing the datasource from a simple test-jsp page and issuing a query against the database works, so the datasource is bound to JNDI.

      Is there any error in our configuration of persistence xml???

      regards,
      hans
        • 1. Re: howto use JNDI datasource with TopLink JPA in a SE environment (tomcat
          va*434117*ek
          Hi,

          For Tomcat use: java:comp/env/jdbc/DatasourceTest

          Bye,
          Lumir
          • 2. Re: howto use JNDI datasource with TopLink JPA in a SE environment (tomcat
            567350
            this does not work either.

            using "java:comp/env/jdbc/DatasourceTest" brings the error:

            javax.naming.NamingException: This context must be accessed throught a java: URL

            omitting the "java:" prefix also does not work (error name"comp" is not bound in this context...)
            • 3. Re: howto use JNDI datasource with TopLink JPA in a SE environment (tomcat
              va*434117*ek
              Hi,

              I forgot for session customizer that I use:

              package x.y;
              import oracle.toplink.essentials.tools.sessionconfiguration.SessionCustomizer;
              import oracle.toplink.essentials.jndi.JNDIConnector;

              public class ToplinkSessionCustomizer implements SessionCustomizer
              {
              public void customize(Session session) throws Exception
              {
              JNDIConnector connector = (JNDIConnector) session.getLogin().getConnector();
              connector.setLookupType(JNDIConnector.STRING_LOOKUP);
              }
              }


              persistence.xml:
              <properties>
                   <property name="toplink.session.customizer" value="x.y.ToplinkSessionCustomizer"/>
              ...

              HTH,
              Lumir
              • 4. Re: howto use JNDI datasource with TopLink JPA in a SE environment (tomcat
                567350
                seems to be working now.

                thank you for your help!

                regards,
                hans
                • 5. Re: howto use JNDI datasource with TopLink JPA in a SE environment (tomcat
                  627446
                  had the same problem. Setting <jta-data-source>java:comp/env/jdbc/testDB</jta-data-source> in persistence.xml and implementing your ToplinkSessionCustomizer class was the magic that made it work - thanks!
                  • 6. Re: howto use JNDI datasource with TopLink JPA in a SE environment (tomcat
                    653529
                    Hi,

                    I just used this config and works fine for me:

                    <persistence-unit name="samplePU" transaction-type="JTA">
                    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
                    <jta-data-source>java:/comp/env/jdbc/sampledb</jta-data-source>
                    <class>... list ...</class>
                    <properties/>
                    </persistence-unit>

                    Regards,
                    Tommy
                    • 7. Re: howto use JNDI datasource with TopLink JPA in a SE environment (tomcat
                      630184
                      Hi,

                      I have gone through this set to have JNDI work with toplink essentials. I am using Netbeans 6 and Tomcat 6. I tried to practice with the tutorial at http://sageniuz.blogspot.com/2007/12/netbeans-60-little-jpa-example.html .

                      I modified my persistence.xml to

                      <?xml version="1.0" encoding="UTF-8"?>
                      <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
                      <persistence-unit name="JPA_JNDIPU" transaction-type="RESOURCE_LOCAL">
                      <description>This unit manages Actors.</description>
                      <provider>oracle.toplink.essentials.PersistenceProvider</provider>
                      <non-jta-data-source>java:comp/env/jdbc/PERSONDB</non-jta-data-source>
                      <class>x.y.entities.ActorGenEntity</class>
                      <!-- Database connection properties -->
                      <properties>
                      <property name="toplink.session.customizer" value="x.y.db.TopLinkSessionCustomizer"/>
                      </properties>
                      </persistence-unit>
                      </persistence>

                      I have followed Lumir and created the ToplinkSessionCustomizer as

                      package x.y.db;

                      import oracle.toplink.essentials.jndi.JNDIConnector;
                      import oracle.toplink.essentials.sessions.Session;
                      import oracle.toplink.essentials.tools.sessionconfiguration.SessionCustomizer;

                      public class TopLinkSessionCustomizer implements SessionCustomizer{

                      public void customize(Session session) throws Exception{

                      JNDIConnector connector =
                      (JNDIConnector)session.getLogin().getConnector();
                      connector.setLookupType(JNDIConnector.STRING_LOOKUP);
                      }

                      }

                      I have created a JUnit test as in the example at http://sageniuz.blogspot.com/2007/12/netbeans-60-little-jpa-example.html but when I run it I get the exception:

                      [TopLink Info]: 2008.08.11 02:39:11.160--ServerSession(7785463)--TopLink, version: Oracle TopLink Essentials - 2.0 (Build b58g-fcs (09/07/2007))
                      Exception Description: Cannot acquire data source [java:comp/env/jdbc/PERSONDB].
                      Internal Exception: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial)

                      Please help where am I going wrong?
                      thnx.
                      • 8. Re: howto use JNDI datasource with TopLink JPA in a SE environment (tomcat 5)?
                        612864
                        xsiyes,
                        I am not able to reproduce your context error, I am able to reproduce the error when a SessionCustomizer is not used on Tomcat to override the lookupType.

                        "Internal Exception: javax.naming.NamingException: This context must be accessed throught a java: URL"

                        For your context error, verify that your conf/server.xml <Resource> and <Context> elements are setup to match your persistence.xml JTA attribute.

                        See an example of running EclipseLink JPA in SE application managed mode as a servlet on the Tomcat 6 web container where the datasource is JTA:

                        http://wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial#JNDI_Datasource_Setup

                        Also, test your context in stages and break up the jndi name into two lookups.
                        public class JPAEclipseLinkSessionCustomizer implements SessionCustomizer {
                        public void customize(Session session) throws Exception {
                        JNDIConnector connector = null;
                        DataSource dataSource = null;
                        Context context = null;
                        Context envContext = null;
                        try {
                        context = new InitialContext();
                        // verify context
                        if (null != context) {
                        envContext = (Context) context.lookup("java:/comp/env");
                        dataSource = (DataSource) envContext.lookup("ds/OracleDS");
                        }
                        // get connector and modify the lookup type
                        connector = (JNDIConnector)session.getLogin().getConnector(); // possible CCE
                        connector.setLookupType(JNDIConnector.STRING_LOOKUP);


                        thank you
                        /michael
                        • 9. Re: howto use JNDI datasource with TopLink JPA in a SE environment (tomcat
                          630184
                          Hi Micheal,

                          I have changed my TopLinkSessionCustomizer class to test my context in stages as you have suggested:

                          package x.y.db;

                          import javax.naming.Context;
                          import javax.naming.InitialContext;
                          import javax.naming.NamingException;
                          import javax.sql.DataSource;
                          import oracle.toplink.essentials.jndi.JNDIConnector;
                          import oracle.toplink.essentials.sessions.Session;
                          import oracle.toplink.essentials.tools.sessionconfiguration.SessionCustomizer;

                          public class TopLinkSessionCustomizer implements SessionCustomizer {

                          public void customize(Session session) throws Exception {

                          JNDIConnector connector = null;
                          DataSource dataSource = null;
                          InitialContext initCxt = null;
                          try {
                          initCxt = new InitialContext();
                          // verify context
                          if (initCxt != null) {
                          dataSource = (DataSource)initCxt.lookup("java:/comp/env/jdbc/PERSONDB");
                          }
                          // get connector and modify the lookup type
                          connector = (JNDIConnector) session.getLogin().getConnector();
                          connector.setLookupType(JNDIConnector.STRING_LOOKUP);
                          } catch (NamingException ex) {
                          ex.printStackTrace();
                          }
                          }
                          }

                          I set up my <context> in tomcat

                          <?xml version="1.0" encoding="UTF-8"?>
                          <Context path="/JPA_JNDI">
                          <Resource auth="Container"
                          driverClassName="oracle.jdbc.OracleDriver"
                          maxActive="130"
                          maxIdle="10"
                          maxWait="1000"
                          name="jdbc/PERSONDB"
                          password="mypassword"
                          type="javax.sql.DataSource"
                          url="jdbc:oracle:thin:@localhost:1521:PERSONDB"
                          username="myusername"/>
                          </Context>



                          and I still get the same exception when I run JUnit test class.
                          I have however realized that when I run my test servlet Hello.java, this exception is not encountered and my expected output is displayed. I cant list my test class and test servlet code as my text becomes unreadable here because of too much text and no code formating tags :-( . Thanx for your help.

                          Alex.

                          Message was edited by:
                          xsiyez
                          • 10. Re: howto use JNDI datasource with TopLink JPA in a SE environment (tomcat
                            630184
                            Here is the exception details:

                            javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
                                 at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
                                 at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
                                 at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
                                 at javax.naming.InitialContext.lookup(InitialContext.java:392)
                                 at com.comesa.entities.manager.TopLinkSessionCustomizer.customize(TopLinkSessionCustomizer.java:21)
                                 at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.processSessionCustomizer(EntityManagerSetupImpl.java:1002)
                                 at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.updateServerSession(EntityManagerSetupImpl.java:980)
                                 at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:225)
                                 at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:93)
                                 at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:126)
                                 at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:120)
                                 at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:91)
                                 at com.comesa.jutest.TestActorManager.setUp(TestActorManager.java:31)
                                 at junit.framework.TestCase.runBare(TestCase.java:128)
                                 at junit.framework.TestResult$1.protect(TestResult.java:106)
                                 at junit.framework.TestResult.runProtected(TestResult.java:124)
                                 at junit.framework.TestResult.run(TestResult.java:109)
                            [TopLink Info]: 2008.08.14 09:52:27.327--ServerSession(1892095)--TopLink, version: Oracle TopLink Essentials - 2.0 (Build b58g-fcs (09/07/2007))
                                 at junit.framework.TestCase.run(TestCase.java:120)
                                 at junit.framework.TestSuite.runTest(TestSuite.java:230)
                                 at junit.framework.TestSuite.run(TestSuite.java:225)
                                 at org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:35)
                            Exception Description: Cannot acquire data source [java:comp/env/jdbc/PERSONDB].
                            Internal Exception: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial)
                                 at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:32)
                                 at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:421)
                                 at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:912)
                                 at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:766)
                            • 11. Re: howto use JNDI datasource with TopLink JPA in a SE environment (tomcat 5)?
                              612864
                              Alex,
                              Hi, the instructions above are specific to classes/servlets running under the web application classloader inside the Tomcat container - requiring no customization of the JNDI context - which seems to be ok in your app.

                              Using JNDI outside the container:

                              When running JUnit SE code against a datasource I usually just specify the .jdbc. elements in persistence.xml - but I am curious about reusing the JNDI datasource that is available to in-container servlets.
                              If you want to test code running outside the container against the Tomcat JNDI provider - like in a JUnit SE test case then you will to do one of the following which have both been verified on a SE stand alone JPA app using EclipseLink as the JPA provider and Tomcat 6 as the JNDI datasource provider....

                              1) Setup a JNDI datasource factory/proxy to configure your System properties picked up by (new InitialContext()), create a context using these properties, create all the sub contexts java:, java:/comp etc.. , create a pooled DataSource and bind it to your context before you attempt to use the context.

                              persistence.xml (J2SE only - jta-data* or non-jta-data* works)
                              <persistence-unit name="statJPA" transaction-type="RESOURCE_LOCAL">
                              <!-- persistence-unit name="statJPA" transaction-type="JTA"-->
                              <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
                              <!-- jta-data-source>java:/comp/env/ds/OracleDS</jta-data-source-->
                              <non-jta-data-source>java:/comp/env/ds/OracleDS</non-jta-data-source>
                              <class>org.eclipse....list all entities</class>
                              <properties>
                              <property name="eclipselink.logging.level" value="FINEST"/>
                              </properties>
                              </persistence-unit>

                              - Add the following jars to your out-of-container SE app
                                   <classpathentry kind="lib" path="C:/opt/tomcat6/bin/tomcat-juli.jar"/>
                                   <classpathentry kind="lib" path="C:/opt/tomcat6/bin/bootstrap.jar"/>
                                   <classpathentry kind="lib" path="C:/opt/tomcat6/lib/catalina.jar"/>

                              - Add the following piece of SE DS configuration code to your non-WAR out-of-container SE class (from Randy Carver at SUN - thank you)
                              http://blogs.sun.com/randystuph/entry/injecting_jndi_datasources_for_junit


                              public void configureDataSource() {
                              try {
                              System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
                              System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming");
                              InitialContext ic = new InitialContext();
                              ic.createSubcontext("java:");
                              ic.createSubcontext("java:/comp");
                              ic.createSubcontext("java:/comp/env");
                              ic.createSubcontext("java:/comp/env/ds");

                              // Construct DataSource
                              OracleConnectionPoolDataSource ds = new OracleConnectionPoolDataSource();
                              ds.setURL("jdbc:oracle:thin:@x.x.x.x:1521:orcl");
                              ds.setUser("user");
                              ds.setPassword("pw");

                              ic.bind("java:/comp/env/ds/OracleDS", ds);
                              } catch (Exception e) { // refactor
                              e.printStackTrace();
                              }
                              }


                              - Start tomcat (so we can connect via JNDI)
                              - Run your SE app (outside the web container)

                              2) Or, you could just specify all your RESOURCE_LOCAL jdbc properties and remove the non-jta-data-source element
                              <property name="eclipselink.jdbc.platform" value="oracle.toplink.platform.database.<yourdb>"/>
                              <property name="eclipselink.jdbc.driver" value="<your db driver>"/>
                              <property name="eclipselink.jdbc.url" value="<your db url>"/>
                              <property name="eclipselink.jdbc.user" value="user"/>
                              <property name="eclipselink.jdbc.password" value="pw"/>

                              logs:
                              [EL Config]: 2008.08.14 10:03:32.753--ServerSession(20287235)--Connection(29089096)--Thread(Thread[main,5,main])--Connected: jdbc:oracle:thin:@x.x.x.x:1521:orcl
                                   User: S****
                                   Database: Oracle Version: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
                              With the Partitioning, OLAP and Data Mining options
                                   Driver: Oracle JDBC driver Version: 11.1.0.0.0-Beta5

                              thank you
                              /michael

                              www.eclipselink.org
                              • 12. Re: howto use JNDI datasource with TopLink JPA in a SE environment (tomcat
                                630184
                                Hi Micheal,

                                Thanks a lot for the elaboration. You have cleared my mind. :-)

                                Alex.
                                • 13. Re: howto use JNDI datasource with TopLink JPA in a SE environment (tomcat 5)?
                                  671888
                                  I'm with the same problem, I tryed to do many many things to solve this problem but It doesn't work yet...

                                  this is the main class:

                                  public class testaEJB {

                                  public static void main(String [] args) {

                                  try {

                                  List reserva = new ArrayList();
                                  reserva.add(1);

                                  List voo = new ArrayList();
                                  voo.add(1);

                                  Aeroporto a = new Aeroporto();
                                  a.setCdAeroporto(Short.parseShort("4"));
                                  a.setNmAeroporto("nmAeroporto");
                                  a.setNmCidAeroporto("nmCidadeAero");
                                  a.setReservaCollection(reserva);
                                  a.setVooCollection(voo);

                                  testeclass t = new testeclass();
                                  t.persist(a);

                                  }catch(Exception e){
                                  e.printStackTrace();
                                  }
                                  }
                                  }


                                  In this class I call the persistence:

                                  public class testeclass {

                                  public static EntityManagerFactory emf = Persistence.createEntityManagerFactory("ReservaPassagensEJBPU2");

                                  public void persist(Object object) {
                                  try {
                                  EntityManager em = null;

                                  em = emf.createEntityManager();
                                  em.getTransaction().begin();

                                  em.persist(object);

                                  em.getTransaction().commit();

                                  } catch (Exception e) {
                                  java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE, "exception caught", e);
                                  throw new RuntimeException(e);
                                  }
                                  }

                                  }

                                  I implemented too the class:

                                  public class ToplinkSessionCustomizer implements SessionCustomizer {
                                  public ToplinkSessionCustomizer() {  
                                  super();
                                  }

                                  public void customize(Session session) throws Exception{
                                  JNDIConnector connector = (JNDIConnector) session.getLogin().getConnector();
                                  connector.setLookupType(JNDIConnector.STRING_LOOKUP);
                                  }
                                  }

                                  and finally the persistence.xml

                                  <?xml version="1.0" encoding="UTF-8"?>
                                  <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
                                  <persistence-unit name="ReservaPassagensEJBPU2" transaction-type="JTA">
                                  <provider>oracle.toplink.essentials.PersistenceProvider</provider>
                                  <jta-data-source>SistResevaBanco</jta-data-source>
                                  <class>br.com.reserva.EJB.Aeronave</class>
                                  <class>br.com.reserva.EJB.Aeroporto</class>
                                  <class>br.com.reserva.EJB.Bilhete</class>
                                  <class>br.com.reserva.EJB.Passageiro</class>
                                  <class>br.com.reserva.EJB.Reserva</class>
                                  <class>br.com.reserva.EJB.Usuario</class>
                                  <class>br.com.reserva.EJB.Voo</class>
                                  <exclude-unlisted-classes>true</exclude-unlisted-classes>
                                  <properties>
                                  <property name="toplink.session.customizer" value="br.com.reserva.teste.ToplinkSessionCustomizer"/>
                                  </properties>
                                  </persistence-unit>
                                  </persistence>

                                  Please help me to solve this problem.

                                  tks..

                                  Edited by: user9946291 on 21/11/2008 15:58
                                  • 14. Re: howto use JNDI datasource with TopLink JPA in a SE environment (tomcat 5)?
                                    612864
                                    Luiz,
                                    Hi, the part of your configuration you posted looks fine, it may be a JNDI config issue with your Java SE app - specifically the 2 additions to server.xml on the server, the Tomcat jar classpath additions and the datasource binding and configuration steps in the EclipseLink Tomcat tutorial link below.

                                    I would narrow down the problem by verifying your app runs without JNDI and also verifying that JNDI works outside of your app.

                                    1) Have you verified all the steps required to run a JNDI datasource connection from a stand-alone JPA app posted below?
                                    [http://wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial#Using_JNDI_outside_the_Tomcat_container_for_J2SE_Applications]

                                    2) You didn't post the details of your issue - like any EclipseLink/TopLink logs surrounding your DB lookup so I am unable to comment on your specific problem.
                                    3) Have you verified that the datasource on your running Tomcat server is running fine for servlets - and that this is not a configuration issue for SE apps?
                                    4) Your &lt;jta-data-source&gt;SistResevaBanco&lt;/jta-data-source&gt; does not look correct, I would use the format &lt;jta-data-source&gt;java:comp/env/ds/OracleDS&lt;/jta-data-source&gt;
                                    see...
                                    [http://wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial#JTA_Persistence.xml]

                                    5) Does your JPA application work fine when you use direct jdbc parameters via RESOURCE_LOCAL in your persistence.xml instead of &lt;jta-data-source&gt;
                                    see...
                                    [http://wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial#non-JTA_.28RESOURCE_LOCAL.29_Persistence.xml]

                                    6) Do you really need to use the datasource on the running Tomcat server? try using RESOURCE_LOCAL first and work up to JNDI from there.

                                    thank you
                                    /michael att eclipselink.org
                                    1 2 Previous Next