2011-10-27 27 views
1

我想設置一個1to0..1(零或一)關係,但遇到問題。休眠JPA註釋1到0..1的關係

現在我的假設是使用@OneToMany,而不是@OneToOne。

基本上我希望我的「孩子」表持有「父母」的外鍵(我非常鬆散地使用孩子和父母)。我從來不需要加載「兒童」獨立

這是基本的表結構我想達到像下面

class Item { 
... 
} 

class Invoice { 
    @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL }) 
    @Fetch(FetchMode.JOIN) 
    @JoinColumn(name="RELATED_ITEM_ID", nullable=false) 
    Set<Item> items; 
} 

class Catalogue { 
    @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL }) 
    @Fetch(FetchMode.JOIN) 
    @JoinColumn(name="RELATED_ITEM_ID", nullable=false) 
    Set<Item> items; 
} 

上面的代碼

ITEM { 
    ID 
    RELATED_ITEM_ID 
} 

INVOICE { 
    ID 
} 
CATALOGUE { 
    ID 
} 

Reprsented作爲Java類,如果我只有在hibernate中註冊的發票或目錄才能創建我想要的表格,並且完美地工作。但是,只要我有發票和目錄中註冊兩個,休眠拋出我的錯誤

org.hibernate.MappingException: Duplicate property mapping of _itemsBackref found in package.name.Item 

回答

0

我有點結束了作弊得到這個工作,我多麼希望。我不理想的想要這樣的層次結構,但我需要得到這個工作,並且我認爲這是與解決冬眠有關的妥協。

ITEM { 
    ID 
    RELATED_ITEM_ID 
    DTYPE 
} 

INVOICE { 
    ID 
} 

CATALOGUE { 
    ID 
} 

Reprsented如Java類,如下列

@Entity 
@Table(name="RECIPIENTS") 
abstract class Item { 
    ... 
} 

@Entity 
    public class InvoiceItem extends Item { 
} 

@Entity 
    public class CatalogueItem extends Item { 
} 


class Invoice { 
    @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL }) 
    @Fetch(FetchMode.JOIN) 
    @JoinColumn(name="RELATED_ITEM_ID", nullable=false) 
    Set<InvoiceItem> items; 
} 

class Catalogue { 
    @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL }) 
    @Fetch(FetchMode.JOIN) 
    @JoinColumn(name="RELATED_ITEM_ID", nullable=false) 
    Set<CatalogueItem> items; 
} 
0

我不認爲這是可能映射此架構與Hibernate(至少,只要CustomerRecepient不要」延伸相同的實體)。

這將是更容易使用以下模式來代替:

ADDRESSES { 
    ID 
} 

CUSTOMER { 
    ID 
    ADDRESS_ID 
} 
RECIPIENT { 
    ID 
    ADDRESS_ID 
} 

class Customer { 
    @OneToOne(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL }) 
    @Fetch(FetchMode.JOIN) 
    @JoinColumn(name="ADDRESS_ID") 
    Address address; 
} 

class Recipient { 
    @OneToOne(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL }) 
    @Fetch(FetchMode.JOIN) 
    @JoinColumn(name="ADDRESS_ID") 
    Address address; 
} 
+0

,我可能不應該有使用過的地址作爲我的榜樣,地址存儲複雜。把一個外國人存到一個地址是一個常見的陷阱,它會讓你陷入困境。我已更新了我的原始帖子。 – kabal