OpenJPA
  1. OpenJPA
  2. OPENJPA-1174

OpenJPA performs differently with orm.xml and annotations

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 2.0.0
    • Fix Version/s: 1.1.1, 2.0.0-M3
    • Component/s: jpa
    • Labels:
      None
    • Patch Info:
      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.

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

        Activity

          People

          • Assignee:
            Ravi P Palacherla
            Reporter:
            Ravi P Palacherla
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development