0

我正在按照这里的教程进行操作,并且有一部分我不明白。

4. 运行它 – 案例 1

    session.beginTransaction();
    股票股票 = 新股票();
    stock.setStockCode("7052");
    stock.setStockName("PADINI");
    类别 category1 = new Category("CONSUMER", "CONSUMER COMPANY");
    session.save(category1);

    StockCategory stockCategory = new StockCategory();
    stockCategory.setStock(股票);
    stockCategory.setCategory(category1);
    stockCategory.setCreatedDate(new Date()); //额外的列
    stockCategory.setCreatedBy("系统"); //额外的列

    stock.getStockCategories().add(stockCategory);

    session.save(股票);

    session.getTransaction().commit();

stock 和 category1 之间的关联已创建,同时

    stockCategory.setStock(股票);
    stockCategory.setCategory(category1);

那么,为什么我们还需要

stock.getStockCategories().add(stockCategory);

谢谢!!

4

2 回答 2

2

您不一定需要它来使数据库满意,但不这样做会使对象图不一致。

因此,例如,如果您作为此操作的结果返回股票及其类别,并且客户端代码 (UI) 遍历股票类别以显示系统的新状态,则新创建的股票将显示为没有任何类别,这是错误的。

于 2012-09-14T08:27:46.633 回答
1

严格来说,添加对于hibernate 来持久化对象并不是必需的。如果您要显式保存股票类别,则该关系将保持不变。但是,您只保存股票对象。因此,库存类别需要在集合中,以便 hibernate 可以找到它。

请注意类别集合上的 CascadeType.ALL。这意味着在保存时,hibernate 应该查看此集合中的项目并将它们全部保存。因此,保存库存足以让休眠找到并保存库存类别并保持关系。如果您没有将项目添加到集合中,休眠将无法找到它,因此除非您明确保存 StockCategory,否则不会保存关系。

正如其他答案中所提到的,保持对象图与持久状态一致也被认为是一种很好的做法,以避免在不同时间填充的内容不同的细微错误。

于 2012-09-14T08:30:53.257 回答