OpenJPA - 嵌套的OneToMany关系合并问题

时间:2016-08-18 17:35:01

标签: java jpa openjpa

在此发布此信息,因为我在这里没有引起太多兴趣: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集合中删除它并调用update。我注意到教室没有办公桌,没有问题。但是如果Class Room有桌子,它会抛出一个约束错误,因为它似乎首先尝试删除Class Room,然后是Desks。 (classes_id列有一个外键约束)

我是以错误的方式来做这件事的吗?是否有一些设置我没有让它删除内部&#34;桌面&#34;实例首先删除已删除的Class Room实例?

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

1 个答案:

答案 0 :(得分:0)

在将删除操作级联到子实体时,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