2016-08-18 91 views
1

在這裏張貼這是我沒有看到太大的興趣在這裏:http://www.java-forums.org/jpa/96175-openjpa-one-many-within-one-many-merge-problems.htmlOpenJPA的 - 一個嵌套的一對多關係合併問題

試圖找出如果這是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集合中刪除並致電更新。我注意到課室是否沒有辦公桌,沒有問題。但是,如果課室具有課桌,它會引發一個約束錯誤,因爲它似乎首先嚐試刪除課室,然後是課桌。 (對於classroom_id列,有一個外鍵約束)

我該怎麼做?是否有一些設置讓我在刪除已刪除的Class Room實例之前首先刪除內部「Desk」實例?

任何幫助,將不勝感激。如果您需要更多信息,請讓我知道。 謝謝,

+0

嘗試清除集合:classrom.desks。明確(); –

+0

在將它從學校移除之前嘗試清除教室的書桌集合,但在我更新學校時,它仍然在移除教室之前嘗試移除教室。 – StormyWaters

+0

這似乎是一個openjpa問題。詳情請參閱:http://swexplorations.blogspot.co.uk/2014/08/openjpa-issues-part-2.html。我確信我上次遇到它時使用了openjpa,並且能夠修復它,指定一些配置屬性或使用一些自定義openjpa註釋。現在不記得了。另外http://stackoverflow.com/questions/36274433/openjpa-wrong-order-for-delete-of-child-when-deleting-parent –

回答

0

大約有FK違反OpenJPA的級聯刪除操作到子實體時,各種bug報告:

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