2013-03-05 43 views
0

我有1個實體呼叫項目,我希望能夠鏈接父項與兒童。使用連接表來創建父/子關係。我一直沒有得到任何好的文檔。所以,如果任何人有任何想法,我都耳朵。JPA自我加入使用JoinTable

這就是我所擁有的......大部分時間都在工作。

public class Item implements java.io.Serializable { 
    @Id 
    private Long id; 

    @ManyToOne(optional = true, fetch = FetchType.LAZY) 
    @JoinTable(name = "ITEMTOITEM", joinColumns = { @JoinColumn(name = "ITEMID") }, inverseJoinColumns = { @JoinColumn(name = "PARENTITEMID") }) 
    private Item parent; 

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY) 
    private List<Item> children; 
} 

有時,當我想帶回被綁定到這個項目表我得到以下的錯誤對象:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.webflow.engine.ActionExecutionException: Exception thrown executing [[email protected] targetAction = [email protected], attributes = map['method' -> 'handleEntry']] in state 'oneTimeChargesAndFeesView' of flow 'in-flow' -- action execution attributes were 'map['method' -> 'handleEntry']'; nested exception is Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException 
Internal Exception: java.sql.SQLException: ORA-00904: "PARENTITEM_ITEMID": invalid identifier 

Error Code: 904 
Call: SELECT ITEMID, ITEMSHORTDESC, EFFENDDATE, ITEMDESC, PARENTITEM_ITEMID, ITEMTYPECODE FROM ITEM WHERE (ITEMID = ?) 
    bind => [1250] 
Query: ReadObjectQuery(com.domain.Item) 

任何幫助,將不勝感激。

+0

在這裏,我已經把表圖[點擊這裏](http://dbdsgnr.appspot.com/app#agdkYmRzZ25ycg8LEgZTY2hlbWEY0riZAQw)。 – jtoepfer 2013-03-05 15:36:04

+0

最後一點需要注意的是我需要使用eclipselink和toplink-essentials。所以我只能使用JPA 1.0映射。 – jtoepfer 2013-03-05 16:04:22

回答

0

經過大量閱讀JPA 2.0後,我發現我需要更新版本的Eclipselink 2.3+以支持我正在嘗試做的事情。這裏是我的案例中真正起作用的代碼,但由於我們依賴於舊版本[EclipseLink 2.0.2],所以它不起作用。另外一個項目仍然在使用Toplink-essentials JPA 1.0,它也是這樣做的。

public class Item { 

@ManyToOne(optional = true, fetch = FetchType.LAZY) 
@JoinTable(name = "ITEMINCENTIVESMAPPING", 
     joinColumns = { @JoinColumn(name = "INCENTIVEITEMID", referencedColumnName = "ITEMID", insertable = false, updatable = false) }, 
     inverseJoinColumns = { @JoinColumn(name = "ITEMID", referencedColumnName = "ITEMID", insertable = false, updatable = false) }) 
private Item parentItem; 

@OneToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "ITEMINCENTIVESMAPPING", 
     joinColumns = { @JoinColumn(name = "INCENTIVEITEMID", referencedColumnName = "ITEMID") }, 
     inverseJoinColumns = { @JoinColumn(name = "ITEMID", referencedColumnName = "ITEMID") }) 
private List<Item> items; 

} 
+0

對我來說,看起來您已經映射了兩個單獨的關係:單向多對一和單向一對多。爲什麼不映射單一的雙向關係?這是針對自引用多對多關係(使用雙向映射)提出的解決方案:http://drag0sd0g.blogspot.com/2010/03/many-to-many-self-reference-in- java.html – scottb 2016-06-08 19:08:12

+0

如何在這種類型的模型上自定義CRUD操作?例如通過parentItem()獲取。任何幫助表示讚賞。謝謝!!! – Musa 2017-04-21 06:22:26

2

嘗試使用@JoinColumn代替:

@ManyToOne(optional = true, fetch = FetchType.LAZY) 
@JoinColumn(name = "PARENTITEMID", referencedColumnName = "ITEMID") 
private Item parent; 

@OneToMany(
     cascade = {CascadeType.ALL}, 
     orphanRemoval = true, 
     fetch = FetchType.LAZY 
) 
@JoinColumn(name = "PARENTITEMID") 
private List<Item> children; 
+0

我正在使用父和子實體之間的連接表。我相信你的映射只允許一個單獨的映射。 – jtoepfer 2013-03-05 15:13:16

+0

這是沒有附加表的映射。每個孩子都有鏈接到父母。 – 2013-03-05 16:37:57

0

我相信@JoinTable只允許在@OneToOne或@OneToMany或@ManyToMany,我不認爲它使一個@ManyToOne任何意義。使用@JoinColumn或@OneToOne。

另外你的@OneToMany沒有意義,mappedBy必須是一個屬性,你沒有parentItem,它應該是父母,父母應該使用@JoinColumn。

+0

詹姆斯,謝謝你的提升,mappedBy是一個CAP錯誤。我將它固定在原文中。 – jtoepfer 2013-03-05 19:06:42