Java 对JPA感到困惑
我有两节课Java 对JPA感到困惑,java,jpa,eclipselink,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
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;
}
公共类发票{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“invoice\u id”,unique=true)
因维德私人酒店;
@OneToMany(mappedBy=“invoiceList”,cascade=CascadeType.ALL,fetch=FetchType.LAZY,orphanRemoving=true)
私人清单项目清单;
@列(name=“发票金额”,可空=假)
私人双重入侵;
}
以及
公共类项目{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“item\u id”,unique=true)
私有int-itemId;
@manytone(可选=false,targetEntity=Invoice.class)
@JoinColumn(name=“发票号”)
私人清单发票清单;
}
我是JPA的新手。所以我的理解可能不准确
我的理解是,如果我保存发票,则该瞬间的发票id应级联到所有项目的发票id
但是,我看到项目正在保存,但获取项目的null
代替发票id
我错过了什么
更新!!!更新强>
好的,所以我将
@ManyToOne
更改为一个单数属性,并执行了objItem.setInvoice(objInvoice)
并保存了它。但是,我仍然在发票id上获得NULL
您正在注释多对一关系,但在两侧都使用集合。这是行不通的。一侧必须将关系映射到单个属性。在你的情况下,应该是
@ManyToOne
private Invoice invoice
也许你更需要一个多对多的关系。在这种情况下,您需要将注释更改为@ManyToMany
,并去掉级联(它们往往无法从多方面按预期工作)
targetEntity
属性和@JoinColumn
注释在项目
的发票
属性上是多余的
为了让
项目
保存相关发票的id,您首先需要设置项目
的发票
属性,因为项目是拥有方(存储关系信息的一方) 您正在注释多对一关系,但在两侧都使用集合。这是行不通的。一侧必须将关系映射到单个属性。在你的情况下,应该是
@ManyToOne
private Invoice invoice
也许你更需要一个多对多的关系。在这种情况下,您需要将注释更改为@ManyToMany
,并去掉级联(它们往往无法从多方面按预期工作)
targetEntity
属性和@JoinColumn
注释在项目
的发票
属性上是多余的
为了让
项目
保存相关发票的id,您首先需要设置项目
的发票
属性,因为项目是拥有方(存储关系信息的一方) 我不确定这是你唯一的问题,但1:n关系不应该有一个双向的列表。如果您将List
转换为一个简单的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;
}
公共类项目{
@manytone(可选=false,targetEntity=Invoice.class)
@JoinColumn(name=“发票号”)
私人发票;
}
公共类发票{
@OneToMany(mappedBy=“invoiceList”,cascade=CascadeType.ALL,fetch=FetchType.LAZY,orphanRemoving=true)
私人清单项目清单;
}
我不确定这是您唯一的问题,但1:n关系不应该有一个双向的列表。如果您将List
转换为一个简单的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;
}
公共类项目{
@manytone(可选=false,targetEntity=Invoice.class)
@JoinColumn(name=“发票号”)
私人发票;
}
公共类发票{
@OneToMany(mappedBy=“invoiceList”,cascade=CascadeType.ALL,fetch=FetchType.LAZY,orphanRemoving=true)
私人清单项目清单;
}
Ok,所以我将@ManyToOne更改为单数属性,并执行了objItem.setInvoice(objInvoice)并保存了它。但是,我的发票id仍然为空。可能会出错的事情太多了。看起来我们只移除了其中的一部分。如果没有您当前的代码,包括进行设置和保存的代码,我猜不出哪里出了问题。请相应地更新问题或创建一个新问题。谢谢。我让它跑了。我只是遇到了一些逻辑错误,导致无法保存正确的数据。所以我将@ManyToOne更改为单数属性,并执行了objItem.setInvoice(objInvoice)并保存了它。但是,我的发票id仍然为空。可能会出错的事情太多了。看起来我们只移除了其中的一部分。如果没有您当前的代码,包括进行设置和保存的代码,我猜不出哪里出了问题。请相应地更新问题或创建一个新问题。谢谢。我让它跑了。我只是有一些逻辑错误,阻止了正确的数据被保存。