我有以下模型:

报告,
ReportSection和
ReportSectionProperty。

报表具有零个到多个ReportSections,ReportSection具有零个到许多ReportSectionProperties。这将被视为三级深层对象图。

我创建新的报表,然后向其中添加一些部分,然后向其中添加一些属性。当我尝试保留报告时,出现以下错误:

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]


因此,OpenJPA保留了对象图,但是它还是从中间开始的。 id_node 186确实是Report表的下一个ID,但是很明显,在保存ReportSection时不会保存该对象。

如果我在添加节或属性的每个操作之间放置em.persist(report)然后em.flush(),则一切正常。这是要走的路吗?

如果我不向节中添加任何属性,则即使没有em.flush(),持久化报表也可以工作。

我使用OpenJPA 2.0.3作为JPA提供程序。



也许代码的一些相关部分:

Report.java

public class Report{

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

    public void addReportSection(ReportSection section){
        synchronized (this) {
            if (getReportSections() == null)
                reportSections = new ArrayList();
            reportSections.add(section);
            section.setReport(this);
        }
    }
}


ReportSection.java

公共类ReportSection {

    @多多
    @JoinColumn(name =“ id_node”)
    私人报告报告;

    @OneToMany(targetEntity = ReportSectionProperty.class,级联= CascadeType.ALL,mappedBy =“ reportSection”)
    私有列表reportSectionProperties;

    公共无效setReport(报告报告){
        this.report =报告;
    }

    公共无效addReportSectionProperty(ReportSectionProperty reportSectionProperty){
        已同步(this){
            如果(getReportSectionProperties()== null)
                reportSectionProperties = new ArrayList();
            reportSectionProperties.add(reportSectionProperty);
            reportSectionProperty.setReportSection(this);
        }
    }
}

ReportSectionProperty

公共类ReportSectionProperty {

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name =“ id_report_section”)
    私人ReportSection reportSection;

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

最佳答案

这可能是一个死线程,但是由于我遇到了类似的问题,所以我想向大家展示我如何解决该问题,以备将来参考(以防万一,必须处理OpenJPA)

尝试将此属性设置到persistence.xml中,以便OpenJPA可以正确顺序重新排列sql语句。

属性名称=“ openjpa.jdbc.SchemaFactory” value =“ native(ForeignKeys = true)”

http://openjpa.apache.org/faq.html#FAQ-CanOpenJPAreorderSQLstatementstosatisfydatabaseforeignkeyconstraints%253F

关于java - 在没有em.flush()的情况下使用JPA保留深层对象图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3717887/

10-10 10:10