我有一个一对多的关系:订单和项目。一个订单可能有很多项目 下面的代码(所有代码)是由 Spring Template 项目自动生成的:
在订单方面:
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="ORDER_ID")
private Collection<Item> items = new LinkedHashSet<Item>();
在项目方面:
@ManyToOne
private Order order;
有效的测试代码:
order.getItems().add(new Item());
session.save(order)
Order other = (Order) session.get(Order.class, order.getId());
assertEquals(1, other.getItems().size());
在互联网和各种网站上搜索关于 1 <---> 许多关系的教程时,我通常会找到诸如示例之类的代码:休眠一对多
一侧(股票)
@OneToMany(fetch = FetchType.LAZY, mappedBy = "stock")
public Set<StockDailyRecord> getStockDailyRecords() {
return this.stockDailyRecords;}
多方(股票记录)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "STOCK_ID", nullable = false)
public Stock getStock() {
return this.stock;}
- 为什么JoinColumn Annotation 放置不同?根据spring 代码,关系的所有者在One 的一边,而不是许多的一边。这是为什么?
- 尽管这种关系根本没有 mappedBy 属性,所以可以说这是从订单到项目的一个方向,它似乎是双向的。即 order.getItems().add(new Item) 和 order.getItems().iterator().next().getOrder() 也可以!最重要的是,在实际数据库中创建的表似乎没问题。
- 如果我们重构第一个代码(见下面重构的代码)并按照教程建议的双向映射放置注释,那么 2/3 的测试会失败,因为没有项目保存在数据库中(断言错误预期为 1,但使用 order 时为 0 .getItems().add(new Item())) .注意spring tempate测试代码保持不变。为什么?
- 它是否与放置在 get 方法上的注释与放置在私有字段上的注释有关?
- 在数据库中保存项目和订单的正确方法是什么(java代码)?
谢谢
未通过测试的重构代码:
一方面:
@OneToMany(cascade=CascadeType.ALL,mappedBy="order")
private Collection<Item> items = new LinkedHashSet<Item>();
多方面:
@ManyToOne
@JoinColumn(name="ORDER_ID")
private Order order;