休眠多对多的例子

时间:2012-09-14 08:21:23

标签: database hibernate

我正在关注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();

时创建了库存和类别1之间的关联
    stockCategory.setStock(stock);
    stockCategory.setCategory(category1);

然后,为什么我们仍然需要

stock.getStockCategories().add(stockCategory);

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

严格地说,hibernate不需要添加来持久保存对象。如果您要明确保存库存类别,那么关系将保持不变。但是,您只保存库存对象。因此,库存类别需要在集合中,以便hibernate可以找到它。

注意类别集合上的CascadeType.ALL。这意味着在保存时,hibernate应该查看此集合中的项目并将其全部保存。由于这种节省,股票足以让hibernate找到并保存股票类别并保持关系。如果你没有将项添加到集合中,hibernate将无法找到它,因此除非你明确保存了StockCategory,否则不会保存关系。

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