Spring模板项目jpa注释

时间:2013-06-18 11:26:02

标签: spring hibernate spring-mvc jpa hibernate-mapping

我有一对多的关系:订单和商品。订单可能包含大量商品 下面的代码(all code)由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&lt; ---&gt;上的教程搜索互联网和各种网站时许多关系我通常会找到代码,例如:hibernate one to many

一方(股票)

@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 atttibute,所以可以说这是从订单到项目的一个方向,它似乎是双向的。即order.getItems()。add(new Item)和order.getItems()。iterator()。next()。getOrder()也可以!最重要的是,在实际数据库中创建的表似乎没问题。
  • 如果我们重构第一个代码(参见下面的重构)并将注释放在教程建议的双向映射中,那么2/3的测试会失败,因为没有项目保存在数据库中(断言错误预期为1但是为0当使用order.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;

0 个答案:

没有答案