【问题标题】:OpenJPA - Nested OneToMany relationships merge issueOpenJPA - 嵌套的 OneToMany 关系合并问题
【发布时间】:2016-12-25 17:53:09
【问题描述】:

在此处发布此内容,因为我在这里没有看到太多兴趣:http://www.java-forums.org/jpa/96175-openjpa-one-many-within-one-many-merge-problems.html

试图弄清楚这是 OpenJPA 的问题还是我可能做错了什么......

我在尝试使用 OpenJPA 更新包含与另一个实体的一对多关系的实体时遇到问题,该实体与另一个实体具有一对多关系。这是我正在谈论的一个简单示例:

@Entity
@Table(name = "school")
public class School {

    @Column(name = "id")
    protected Long id;

    @Column(name = "name")
    protected String name;

    @OneToMany(mappedBy = "school", orphanRemoval = true, cascade = CascadeType.ALL)
    protected Collection<ClassRoom> classRooms;
}

@Entity
@Table(name = "classroom")
public class ClassRoom {

    @Column(name = "id")
    protected Long id;

    @Column(name = "room_number")
    protected String roomNumber;

    @ManyToOne
    @JoinColumn(name = "school_id")
    protected School school;

    @OneToMany(mappedBy = "classRoom", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    protected Collection<Desk> desks;

}

@Entity
@Table(name = "desk")
public class Desk {

    @Column(name = "id")
    protected Long id;

    @ManyToOne
    @JoinColumn(name = "classroom_id")
    protected ClassRoom classRoom;

}

在 SchoolService 类中,我有以下更新方法:

    @Transactional
    public void update(School school) {
        em.merge(school);
    }

我正在尝试从学校中删除教室。我将它从 classRooms 集合中删除并调用更新。我注意到如果教室没有桌子,就没有问题。但是如果教室有桌子,它会抛出一个约束错误,因为它似乎首先尝试删除教室,然后是桌子。 (classic_id 列有外键约束)

我是不是走错了路?在删除已删除的教室实例之前,我是否缺少一些设置以使其首先删除内部“桌面”实例?

任何帮助将不胜感激。如果您需要更多信息,请告诉我。 谢谢,

【问题讨论】:

  • 尝试清除收藏:classrom.desks.clear();
  • 尝试在将教室的课桌集合从学校移除之前调用 clear,但在我更新学校时它仍在尝试移除课桌之前移除课桌。
  • 这似乎是一个 openjpa 问题。在此处查看详细信息:swexplorations.blogspot.co.uk/2014/08/…。我确定我上次使用 openjpa 时遇到过它,并且能够通过指定一些配置属性或使用一些自定义 openjpa 注释来修复它。具体暂时记不清了。还有stackoverflow.com/questions/36274433/…
  • 很高兴知道这是 openjpa 的问题,我还没有遇到任何适合我的设置/注释,所以那里的任何信息都会有用。
  • 好的,我想我已经记住了解决方案。尝试在集合映射上添加注释 org.apache.openjpa.persistence.jdbc.ForeignKey 注释:issues.apache.org/jira/browse/OPENJPA-1936

标签: java jpa openjpa


【解决方案1】:

在将删除操作级联到子实体时,OpenJPA 中存在关于 FK 违规的各种错误报告:

OpenJPA 常见问题解答指出以下几点:

http://openjpa.apache.org/faq.html#reorder

OpenJPA 可以重新排序 SQL 语句以满足数据库外键 约束?

是的。 OpenJPA 可以使用重新排序和/或批处理 SQL 语句 不同的可配置策略。默认策略能够 重新排序 SQL 语句以满足外键约束。 但是,您必须告诉 OpenJPA 读取现有的外键 来自数据库架构的信息:

您似乎可以通过在 OpenJPA 配置中设置以下属性来强制语句的正确顺序

<property name="openjpa.jdbc.SchemaFactory"> value="native(ForeignKeys=true)"/>

或通过将 org.apache.openjpa.persistence.jdbc.ForeignKey 注释添加到映射:

@OneToMany(mappedBy = "classRoom", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@org.apache.openjpa.persistence.jdbc.ForeignKey
protected Collection<Desk> desks;

另见:

https://issues.apache.org/jira/browse/OPENJPA-1936

【讨论】:

    猜你喜欢
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2011-11-08
    相关资源
    最近更新 更多