2012-02-20 75 views
12

我在使用JoinTables時遇到了一些雙向一對多關聯的問題。這是我的了:雙向一對多連接表

A類:

@OneToMany 
@JoinTable(name="join_table", 
    JoinColumns={@JoinColumn(name="a_id")}, 
    inverseJoinColumns={@JoinColumn(name="b_id")} 
) 
@Cascade(org.hibernate.annotations.CascadeType.ALL) 
public Set<B> getBs() { 
    return bs; 
} 

B類:

@ManyToOne 
@JoinTable(name="join_table", 
    joinColumns={@JoinColumn(name="b_id", insertable=false,updatable=false)}, 
    inverseJoinColumns={@JoinColumn(name="a_id", insertable=false,updatable=false)}) 
public A getA() { 
    return a; 
} 

如果我創建A和B的情況下,B的實例添加到和保存。有用。但是,當我重新加載A的實例並嘗試訪問B的集合時,它會拋出LazyInitializationError,並顯示消息「非法訪問加載集合」。

我在哪裏錯了? :)任何人都可以指出我使用連接表的雙向關聯的例子。在所有權保留給A類的地方,我已經通過hibernate.org的文檔進行了搜索,但我似乎找不到它。

-Daniel

+0

爲什麼在派生實體(B)中使用不同的連接表? – Perception 2012-02-20 12:04:07

+0

對不起,我更新了這個問題。原因是我修改了這個例子的實際的兩個類(基本上把它們重命名爲A和B)) – JustDanyul 2012-02-20 12:11:21

+0

好的。請將您遇到的錯誤添加到問題中。 – Perception 2012-02-20 12:20:26

回答

7

你的映射是正確的,這就是爲什麼該條目得到保存在數據庫中。由於Lazy Initialization,提取中的問題是

爲了解決它修改類A作爲映射,

@OneToMany(fetch=FetchType.LAZY) 
@JoinTable(name="join_table", 
    joinColumns={@JoinColumn(name="a_id")}, 
    inverseJoinColumns={@JoinColumn(name="b_id")} 
) 
@Cascade(org.hibernate.annotations.CascadeType.ALL) 
public Set<B> getBs() { 
    return bs; 
} 

這將觸發一個附加的查詢表中B和初始化集合。這可能會影響表現,具體取決於被告表中的條目數量。

閱讀API here瞭解更多信息。