openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Rade Martinović (JIRA) <>
Subject [jira] Created: (OPENJPA-1805) Error when persisting deep object graph
Date Mon, 20 Sep 2010 09:57:33 GMT
Error when persisting deep object graph

                 Key: OPENJPA-1805
             Project: OpenJPA
          Issue Type: Bug
    Affects Versions: 2.0.1
         Environment: Windows XP SP3, Postgres database
            Reporter: Rade Martinović

I have following model:

*ReportSection* and

*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:

<pre><code>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>();
<pre><code>public class ReportSection{

	private Report report;

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

	public void setReport(Report report) { = report;

	public void addReportSectionProperty(ReportSectionProperty reportSectionProperty){
		synchronized (this) {
			if (getReportSectionProperties() == null)
				reportSectionProperties = new ArrayList<ReportSectionProperty>();

<pre><code>public class ReportSectionProperty{

	private ReportSection reportSection;

	public void setReportSection(ReportSection reportSection) {
		this.reportSection = reportSection;

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

View raw message