2012-09-14 154 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)遍历股票类别以显示系统的新状态,则新创建的股票将没有任何类别出现,这是错误的。