Uploaded image for project: 'OpenJPA'
  1. OpenJPA
  2. OPENJPA-1174

OpenJPA performs differently with orm.xml and annotations

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.0.0
    • 1.2.0, 2.0.0-M3
    • jpa
    • None
    • Patch Available

    Description

      When configurations are provided from orm.xml file, some behaviors are different from behaviors on annotation configuration.
      The behavior difference occurs when fetch=LAZY is specified on many-to-one mapping.

      When there are two objects Country and Security and Security has many-to-one mapping field country,
      OpenJPA executes one more SQL query to get country field if orm.xml file is used.


      • annotation case

      // step 1) Load country in entity manager
      aUS_country = t.em.find(Country.class, aUS_sid);
      // SELECT t0.NAME FROM TEST16.COUNTRY t0 WHERE t0.COUNTRY_ID = ?

      // step 2) Load security in entity manager
      aI_security = t.em.find(Security.class, aI_sid);
      // SELECT t0.COUNTRY_ID, t0.SYMBOL FROM TEST19.SECURITY t0 WHERE t0.SECURITY_ID = ?

      // step 3) get country from security
      Country aUS_country2 = aI_security.getCountry();
      // no SQL was executed.
      .

      • orm.xml case
        .
        // step 1) Load country in entity manager
        aUS_country = t.em.find(Country.class, aUS_sid);
        // SELECT t0.NAME FROM TEST16.COUNTRY t0 WHERE t0.COUNTRY_ID = ?
        .
        // step 2) Load security in entity manager
        aI_security = t.em.find(Security.class, aI_sid);
        // SELECT t0.SYMBOL FROM TEST16.SECURITY t0 WHERE t0.SECURITY_ID = ?
        .
        // step 3) get country from security
        Country aUS_country2 = aI_security.getCountry();
        // SELECT t1.COUNTRY_ID, t1.NAME FROM TEST16.SECURITY t0, TEST16.COUNTRY t1 WHERE t0.SECURITY_ID = ? AND t0.COUNTRY_ID = t1.COUNTRY_ID

      The important difference is in step 2. When using orm.xml, many-to-one field "country" was not loaded if fetch=LAZY.
      Instead, it's loaded on annotation configuration.
      .
      Because many-to-one "country" field is not loaded, step 3 executes additional SQL to load "country" field on orm.xml.
      Instead, on annotation case, step 3 did not execute any SQLs.

      Attachments

        1. OPENJPA-1174-trunk.patch
          24 kB
          Ravi Prakash Palacherla
        2. OPENJPA-1174-trunk.patch
          15 kB
          Ravi Prakash Palacherla

        Activity

          People

            rpalache Ravi Prakash Palacherla
            rpalache Ravi Prakash Palacherla
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: