openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Albert Lee (Commented) (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (OPENJPA-1805) Error when persisting deep object graph
Date Wed, 14 Mar 2012 19:02:39 GMT

    [ https://issues.apache.org/jira/browse/OPENJPA-1805?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13229504#comment-13229504
] 

Albert Lee commented on OPENJPA-1805:
-------------------------------------

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.
                
> Error when persisting deep object graph
> ---------------------------------------
>
>                 Key: OPENJPA-1805
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1805
>             Project: OpenJPA
>          Issue Type: Bug
>    Affects Versions: 2.0.1
>         Environment: Windows XP SP3, Postgres database
>            Reporter: Rade Martinović
>         Attachments: OPENJPA-1805.test.jar
>
>
> 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;
> 	}
> }

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

       

Mime
View raw message