2012-03-13 18 views
2

我有以下(不需要字段中省略)JPA/Hibernate的級聯各種原因導致多餘的左外連接

public class GeneralUser 
{ 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private long id; 

private String fname; 

@OneToMany(mappedBy = "fromGeneralUser", targetEntity = Friendship.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
private Collection<Friendship> friendships; 
} 

一個簡單的實體GeneralUser讓我給你的我做的一個很簡單的例子:

GeneralUser user = generalUserService.find(id); 
user.setFname("foo") 
user = generalUserService.merge(user); 

我面臨的問題是,合併用戶執行數據庫選擇之前的hibernate比它應該更復雜。更具體地說,select使用上面定義的「友誼」關係(表格)(關係OneToMany)進行左外連接。

任何提示,以避免這種情況?

如果我改變了:

@OneToMany(mappedBy = "fromGeneralUser", targetEntity = Friendship.class, fetch = FetchType.LAZY, cascade = CascadeType.DELETE) 

那麼好的工作,所以它似乎級聯導致冗餘左外連接。

有幫助嗎?

回答

0

左外連接是一個性能改進,用於獲取用戶和負載關聯,這是合併知道數據庫狀態所必需的。如果將其設置爲懶惰,則在合併時不加載,因此不必加載它來合併更改。

+0

嗨Firo感謝您的即時答覆。 關鍵是我有一個以上的關係,像上面那樣,而hibernate總是按照字母順序使這個外部聯接。爲什麼不包括所有的關係,但只有一個? 我可以禁用外連接,但也保持級聯ALL? – 2012-03-13 16:14:07

+0

也許這一個已經改變了某種原因或不是由於某種原因被延遲加載? – Firo 2012-03-13 17:06:14

2

我終於決定拆除瀑布,並自己照顧關係。級聯增加了SQL(連接)的複雜性和性能開銷。

我認爲這個級聯問題需要更多討論。

想想好像其中有一些基本的字段(FNAME,LNAME,等等),並與像(友誼,PRIVATE_MESSAGES等)

如果我使用級聯其它實體的許多關係的用戶的背部骨實體( CascadeType.ALL)任何時候我想合併一個用戶休眠從數據庫中獲取實體,但是也增加了一個性能提升,也提取了一些關係的狀態(比如FRIENDSHIPS),這在大多數情況下是冗餘的。

我還附上說明了同樣的問題另一篇文章:

Using cascades optionally in Hibernate/JPA

也許任何人有更多的經驗將在這裏gine什麼建議嗎?

我個人選擇拆分級聯,手動完成所有關係。

相關問題