对JPA感到困惑

时间:2014-09-19 07:20:16

标签: java jpa eclipselink

我有两节课。

public class Invoice {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "invoice_id", unique = true)
   private int invId;

   @OneToMany(mappedBy = "invoiceList", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
   private List<Item> itemList;

   @Column(name = "invoice_amt", nullable = false)
   private Double invAmt;
 }

public class Item {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "item_id", unique = true)
   private int itemId;

   @ManyToOne(optional = false, targetEntity = Invoice.class)
   @JoinColumn(name="invoice_id")
   private List<Invoice> invoiceList;
}

我是JPA的新手。所以我的理解可能不准确。

我的理解是,如果我保存发票,该广告的 invoice_id 应该级联到所有项目的 invoice_id

但是,我看到项目已保存,但获取null代替该项目的 invoice_id

我错过了什么?

UPDATE !!! UPDATE !!!

好的,所以我将@ManyToOne更改为单数属性并执行objItem.setInvoice(objInvoice)并保存。不过,我仍然会在 invoice_id 上获得NULL

2 个答案:

答案 0 :(得分:3)

您正在注释多对一关系,但在两侧都使用集合。这不行。单方必须将关系映射到单一属性。在你的情况下,它将是

@ManyToOne
private Invoice invoice

也许您宁愿需要多对多的关系。在这种情况下,您需要将注释更改为@ManyToMany并删除级联(它们往往不会像许多方面那样按预期工作)。

targetEntity属性和@JoinColumn注释在invoice Item属性上是多余的。

为了让Item保存相关发票的ID,您首先需要设置invoice的{​​{1}}属性,因为项目是拥有方(存储关系信息)。

答案 1 :(得分:3)

我不确定这是你唯一的问题,但是1:n关系不应该有List两种方式。如果您将List<Invoice>转换为简单的Invoice对象,那么您至少会更接近解决方案。如果您的代码仍然失败,我们可以从那里开始。

public class Item {
    @ManyToOne(optional = false, targetEntity = Invoice.class)
    @JoinColumn(name = "invoice_id")
    private Invoice invoice;
}

public class Invoice {
    @OneToMany(mappedBy = "invoiceList", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    private List<Item> itemList;
}