2011-03-27 40 views
0

我有以下類別:JPA:單向一對多問題

class A{ 
    @OneToOne(cascade=CascadeType.ALL) 
    private B b; 
} 

class C{ 
    @ManyToOne 
    private A a;  
} 

class B{ 
    @OneToOne 
    private A a; 

    @MapKey(name = "name") 
    @OneToMany(cascade = CascadeType.ALL, ...) 
    @JoinColumn(...) 
    private Map<String C> cs; 
} 

如何做我必須指定在B.cs映射加入其中B.a == C.A?

這可能嗎?或者我必須將C.a屬性更改爲C.b? (我更願意保持原樣,因爲實體B只是一個輔助類。) 我也嘗試將B更改爲@Embeddable,但Map不支持嵌入。

回答

0

我想你可以從延伸A.

B如果這不適合你,也許你可以添加一個短暫的財產是指A的ID,

@Transient 
Integer getId1() { 
    return a.getId(); 
} 

和將C使用 id1而不是B的主鍵。

編輯:這不起作用。

+0

「derive」是什麼意思?遺產?。這是一個組合,其中A有更多的屬性,B有更多的屬性。一個關係(繼承)在這裏是錯誤的。 – Puce 2011-03-27 18:12:11

+0

我的意思是'延伸'在這裏。也許你是對的。在這種情況下,我個人將創建另一個基類_A,並使A和B擴展_A。 – 2011-03-27 23:55:49

1

JPA要求所有關係都由Id(外鍵引用主鍵)。 因此,您需要將@ManyToOne從C添加到B. 或者,確保B的Id是A的外鍵(將@OneToOne上的@Id從B添加到A並刪除A的另一個@Id)。 如果B是A的一個子類而不是OneToOne,這也可以。

如果您使用的是EclipseLink,則可以爲關係定義更復雜的標準。您需要使用DescriptorCustomizer和OneToManyMapping API來定義OneToMany的外鍵。

+0

外鍵(在C中)引用主鍵(A),它只是不是B的主鍵。我認爲我很難與JPA不允許將B定義爲@Embeddable。但是你說我只有這3個選擇:@ManyToOne從C到B,@ID從@到@OneToOne從B到A(這是一個很好的做法?)或EclipseLink特定的映射(離開JPA標準),對不對? – Puce 2011-03-29 17:20:39