Spring模板项目jpa注释
我有一对多的关系:订单和物品。一个订单可能有很多项目 以下代码()由Spring模板项目自动生成: 在订单方面: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
@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;