2013-06-05 214 views
2

我目前遇到OneToMany/ManyToOne-Mapping問題。映射是這樣的:JPA /休眠:雙向OneToMany/ManyToOne關係僅適用於單向

public class A implements Serializable { 
    @EmbeddedId 
    private AId id; 

    // Other stuff... 
} 

@Embeddable 
public class AId implements Serializable { 
    @ManyToOne 
    @JoinColumn(name = "B_ID", nullable = false) 
    private B b; 

    // Other stuff... 
} 

public class B implements Serializable { 
    @OneToMany(mappedBy = "id.b") 
    private List<A> as; 

    // Other stuff... 
} 

如果我嘗試使用對象的一切工作就好了訪問對象B,但反方向不會在所有的工作。關係總是空的。

A objectA = findAById(id); 
B objectB = objectA.getB(); // OK 

// But... for example 
objectB.getAs(); // returns null 

我寫了一個小的查詢使用其主鍵讓所有的作爲對象B:

SELECT as FROM B b, IN(b.as) as WHERE b.id = :id 

這工作完全,我得到預期的結果。 我查看了數據庫中的內容,也沒有問題。有誰知道爲什麼這種關係只能在一個方向上發揮作用?

問候,

亞歷

+0

我懷疑,如果支持的mappedBy嵌套屬性名稱(我記得是在舊版本的Hibernate沒有) –

+0

在這似乎是支持其間。 https://hibernate.atlassian.net/browse/ANN-381 – Alex

+0

JPA不允許embeddedIds包含關係,因此這不符合JPA。無論如何,當你可以把關係放入實體本身時,爲什麼要把關係放在嵌入對象中呢?使用mapsid或甚至ID類允許您僅使用實體並避免在實體內維護嵌入式類。 – Chris

回答

1

這是因爲默認情況下@OneToMany有懶抓取。您可以修復使用此 取= FetchType.EAGER

public class B implements Serializable { 
    @OneToMany(mappedBy = "id.b", fetch = FetchType.EAGER) 
    private List<A> as; 

    // Other stuff... 
} 
+0

這意味着懶惰的抓取從不加載數據,這是不正確的。在關係的第一次訪問期間被加載,否則整個延遲獲取的概念將毫無用處。問題是embeddedIds不允許存在關係(就像上面的Chris一樣)。 – Alex