我有两节课。
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
。
答案 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;
}