2012-09-14 204 views
0

我正在按照來自here的教程進行操作,並且有一部分我不明白。休眠多對多示例

4.運行它 - 1

 
    session.beginTransaction(); 
    Stock stock = new Stock(); 
    stock.setStockCode("7052"); 
    stock.setStockName("PADINI"); 
    Category category1 = new Category("CONSUMER", "CONSUMER COMPANY"); 
    session.save(category1); 

    StockCategory stockCategory = new StockCategory(); 
    stockCategory.setStock(stock); 
    stockCategory.setCategory(category1); 
    stockCategory.setCreatedDate(new Date()); //extra column 
    stockCategory.setCreatedBy("system"); //extra column 

    stock.getStockCategories().add(stockCategory); 

    session.save(stock); 

    session.getTransaction().commit(); 

股票和組別之間的關聯已經建立,而

 
    stockCategory.setStock(stock); 
    stockCategory.setCategory(category1); 

那麼,爲什麼我們仍然需要

stock.getStockCategories().add(stockCategory);

案例謝謝!!

+0

您可能還想檢查一下:http://stackoverflow.com/questions/824600/saving-bidirectional-manytomany –

回答

1

嚴格地說,添加對於hibernate來說並不需要持久化對象。如果您明確保存庫存類別,那麼關係將會持續。但是,您只保存股票對象。正因爲如此,股票類別需要在集合中,以便hibernate能夠找到它。

注意類別集合上的CascadeType.ALL。這意味着在保存時,hibernate應該查看這個集合中的項目並保存它們。由於這種節省,股票足以讓休眠找到並保存股票類別並堅持這種關係。如果您沒有將該項目添加到集合中,hibernate將無法找到它,因此除非顯式保存StockCategory,否則關係將不會保存。

正如其他答案中所提到的,通常認爲保持對象圖與持久狀態一致以避免在不同時間填充的內容不同的細微錯誤也是很好的做法。

2

你並不是絕對需要它來使數據庫快樂,但不這樣做會使對象圖不一致。

因此,例如,如果您通過此操作返回股票及其類別,並且客戶端代碼(UI)遍歷股票類別以顯示系統的新狀態,則新創建的股票將沒有任何類別出現,這是錯誤的。