OpenJPA
  1. OpenJPA
  2. OPENJPA-1805

Error when persisting deep object graph

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Cannot Reproduce
    • Affects Version/s: 2.0.1
    • Fix Version/s: None
    • Component/s: None
    • Labels:
      None
    • Environment:
      Windows XP SP3, Postgres database

      Description

      I have following model:

      Report,
      ReportSection and
      ReportSectionProperty.

      Report has zero to many ReportSections, ReportSection has zero to many ReportSectionPropert-ies. This would qualifie as three levels deep object graph.

      I create new Report, then add some sections to it, then add some properties to it. When I try to persist Report, I get following error:

      <pre><code>Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: ERROR: insert or update on table "report_section" violates foreign key constraint "fk_report_section_report"
      Detail: Key (id_node)=(186) is not present in table "report".

      {prepstmnt 20859482 INSERT INTO core.report_section (index_section, name, report_section_type, id_node) VALUES (?, ?, ?, ?) [params=?, ?, ?, ?]}

      [code=0, state=23503]</code></pre>

      So, OpenJPA is persisting object graph, but somehow it started from the middle. id_node 186 is indeed the next id of the Report table but, obviously that object is not saved when ReportSection is being saved.

      If I put em.persist(report) then em.flush() between each operation of adding sections or properties, everything works. Is this the way to go?

      If I don't add any properties to sections, persisting Report works, even without em.flush().

      I use OpenJPA 2.0.1 as JPA provider.

      ----------

      Maybe some relevant parts of the code:

      Report.java

      public class Report{

      @OneToMany(targetEntity = ReportSection.class, cascade = CascadeType.ALL, mappedBy="report")
      private List<ReportSection> reportSections;

      public void addReportSection(ReportSection section){
      synchronized (this)

      { if (getReportSections() == null) reportSections = new ArrayList<ReportSection>(); reportSections.add(section); section.setReport(this); }

      }
      }

      ReportSection.java
      public class ReportSection{

      @ManyToOne
      @JoinColumn(name="id_node")
      private Report report;

      @OneToMany(targetEntity=ReportSectionProperty.class, cascade=CascadeType.ALL, mappedBy="reportSection")
      private List<ReportSectionProperty> reportSectionProperties;

      public void setReport(Report report)

      { this.report = report; }

      public void addReportSectionProperty(ReportSectionProperty reportSectionProperty){
      synchronized (this)

      { if (getReportSectionProperties() == null) reportSectionProperties = new ArrayList<ReportSectionProperty>(); reportSectionProperties.add(reportSectionProperty); reportSectionProperty.setReportSection(this); }

      }
      }

      ReportSectionProperty
      public class ReportSectionProperty{

      @ManyToOne(cascade=CascadeType.ALL)
      @JoinColumn(name="id_report_section")
      private ReportSection reportSection;

      public void setReportSection(ReportSection reportSection)

      { this.reportSection = reportSection; }

      }

        Activity

        Hide
        Rade Martinović added a comment -

        Removed HTML tags from code excerpts

        Show
        Rade Martinović added a comment - Removed HTML tags from code excerpts
        Hide
        Albert Lee added a comment -

        I am trying to reproduce this problem. Attached is a jar contains the source and class file that mimics the described scenario. To run the test:

        java -javaagent:.\openjpa-all-2.2.1-SNAPSHOT.jar -Dopenjpa.ConnectionFactoryProperties=PrintParameters=true -Dopenjpa.Log=DefaultLevel=TRACE -Dopenjpa.ConnectionDriverName=org.apache.derby.jdbc.EmbeddedDriver -Dopenjpa.ConnectionURL="jdbc:derby:test-db;create=true" -cp .\OPENJPA-1805.test.jar;.\openjpa-all-2.2.1-SNAPSHOT.jar;.\derby-10.5.3.0_1.jar test.Main c s

        I am not be able to reproduce the failure.

        Can the originator or any interested party update the test case with the necessary use case to reproduce the problem?

        Thanks,
        Albert Lee.

        Show
        Albert Lee added a comment - I am trying to reproduce this problem. Attached is a jar contains the source and class file that mimics the described scenario. To run the test: java -javaagent:.\openjpa-all-2.2.1-SNAPSHOT.jar -Dopenjpa.ConnectionFactoryProperties=PrintParameters=true -Dopenjpa.Log=DefaultLevel=TRACE -Dopenjpa.ConnectionDriverName=org.apache.derby.jdbc.EmbeddedDriver -Dopenjpa.ConnectionURL="jdbc:derby:test-db;create=true" -cp .\ OPENJPA-1805 .test.jar;.\openjpa-all-2.2.1-SNAPSHOT.jar;.\derby-10.5.3.0_1.jar test.Main c s I am not be able to reproduce the failure. Can the originator or any interested party update the test case with the necessary use case to reproduce the problem? Thanks, Albert Lee.
        Hide
        Rade Martinović added a comment -

        Since the time I have made this issue report I have changed my model and handling of the model considerably.

        I will for now close this issue and open another one if I encounter this issue again.

        Thank you Albert for your effort for testing this issue.

        Show
        Rade Martinović added a comment - Since the time I have made this issue report I have changed my model and handling of the model considerably. I will for now close this issue and open another one if I encounter this issue again. Thank you Albert for your effort for testing this issue.

          People

          • Assignee:
            Unassigned
            Reporter:
            Rade Martinović
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development