0

我有一个一对多的关系:订单和项目。一个订单可能有很多项目 下面的代码(所有代码)是由 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;
4

0 回答 0