Spring模板项目jpa注释

Spring模板项目jpa注释,spring,hibernate,spring-mvc,jpa,hibernate-mapping,Spring,Hibernate,Spring Mvc,Jpa,Hibernate Mapping,我有一对多的关系:订单和物品。一个订单可能有很多项目 以下代码()由Spring模板项目自动生成: 在订单方面: @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="ORDER_ID") private Collection<Item> items = new LinkedHashSet<Item>(); 有效的测试代码: order.getItems().add(new Item()); session.save

我有一对多的关系:订单和物品。一个订单可能有很多项目 以下代码()由Spring模板项目自动生成:

在订单方面:

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="ORDER_ID")
private Collection<Item> items = new LinkedHashSet<Item>();
有效的测试代码:

order.getItems().add(new Item());
session.save(order)
Order other = (Order) session.get(Order.class, order.getId());
assertEquals(1, other.getItems().size());
在互联网和各种网站上搜索关于许多关系的教程时,我通常会找到一些代码,例如:

单面(库存)

  • 为什么JoinColumn注释的位置不同?根据spring代码,关系的所有者位于一方而不是多方。为什么呢
  • 尽管这种关系根本没有mappedBy attibute,所以可以说这是从订单到项目的一个方向,它似乎是双向的。i、 e order.getItems().add(新项目)和order.getItems().iterator().next().getOrder()也可以工作!!除此之外,在实际数据库中创建的表似乎还可以
  • 如果我们重构第一个代码(请参见下面的重构代码),并按照教程中关于双向映射的建议放置注释,那么有2/3的测试会失败,因为数据库中没有保存任何项(断言错误应为1,但在使用order.getItems().add(new Item())时为0)。请注意,spring tempate测试代码保持不变。为什么
  • 它是否与放置在get方法上的注释与放置在私有字段上的注释有关
  • 在数据库(java代码)中保存项目和顺序的正确方法是什么
谢谢

未通过测试的重构代码:

一方面:

@OneToMany(cascade=CascadeType.ALL,mappedBy="order")
private Collection<Item> items = new LinkedHashSet<Item>();

键是mappedby属性。如果没有,那么你有两个独立的关系。我认为ypu发布的代码(由模板生成)有错误,我不认为spring的人会犯那么容易的错误。任何人都可以从spring下载sts并创建一个支持hibernate或jpa的spring模板项目。他们的代码有效。我只是不知道为什么它能工作…我在度假,我不能测试它。另一点很奇怪的是,您混合了JPA和旧Hibernate的概念-它们不一样(Hibernate可以用作JPA实现,但您不这样做)问题标题:JPA,但在您的代码中使用了“会话”,这是一个旧的Hibernate术语。(Jpa使用EntityManager)
@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;}
@OneToMany(cascade=CascadeType.ALL,mappedBy="order")
private Collection<Item> items = new LinkedHashSet<Item>();
@ManyToOne
@JoinColumn(name="ORDER_ID")
private Order order;