Java 在“一对多”映射中,hibernate在更新父表时将数据插入子表中
我刚开始从简单的java jdbc学习hibernate,作为我们项目需求的一部分,我必须维护以上三个类,但当我更新BillingInformation.java实体类对象时,BillingTaxInformation.java和BillingItemInformation.java类对象会插入具有不同记录号的相同对象。请纠正我的错误。您使用的是cascade=CascadeType.ALL,在集合的@OneToMany映射中 这意味着对BillingInformation实体执行的任何操作也将传播到子BillingItemInformation和BillingTaxInformation 那就是你 坚持 刷新 合并 去除 拆卸 。。这同样适用于这些儿童 如果只希望在父实体为 以hibernate语言保存的PERSISTEDor 并删除了@OneToMany最常见的两个选项 ,但在合并和后续更新期间,您不希望将这些操作级联到子级,然后按如下方式设置映射:Java 在“一对多”映射中,hibernate在更新父表时将数据插入子表中,java,sql,hibernate,Java,Sql,Hibernate,我刚开始从简单的java jdbc学习hibernate,作为我们项目需求的一部分,我必须维护以上三个类,但当我更新BillingInformation.java实体类对象时,BillingTaxInformation.java和BillingItemInformation.java类对象会插入具有不同记录号的相同对象。请纠正我的错误。您使用的是cascade=CascadeType.ALL,在集合的@OneToMany映射中 这意味着对BillingInformation实体执行的任何操作也将
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="BILLING_INFORMATION")
public class BillingInformation {
@Id
@Column(name="BILL_NO", unique = true, nullable = false, length = 100)
private String bNo;
@Column(name="BILL_DATE", length = 100)
private String billDate;
@Column(name="PARTY_NAME", length = 100)
private String partyName;
@Column(name="SUB_TOTAL", length = 100)
private String subTotal;
@Column(name="TOTAL", length = 100)
private String total;
@OneToMany(fetch=FetchType.EAGER, mappedBy="billInformation", cascade = CascadeType.ALL,orphanRemoval=true)
Set<BillingItemInformation> setBillingItemInformation;
@OneToMany(fetch=FetchType.EAGER, mappedBy="billInformation", cascade = CascadeType.ALL,orphanRemoval=true)
Set<BillingTaxInformation> setBillingTaxInformation;
----all getters and setters----
}
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="BILLING_ITEM_INFORMATION")
public class BillingItemInformation {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "RECORD_ID", unique = true, nullable = false, length = 100)
private int recordNo;
@Column(name = "S_NO", length = 100)
private String sNo;
@Column(name="ITEM", length = 100)
private String item;
@Column(name="QTY", length = 100)
private String qty;
@Column(name="PRICE", length = 100)
private String price;
@Column(name="AMOUNT", length = 100)
private String amount;
@ManyToOne
@JoinColumn(name="BILL_NO", nullable=false)
private BillingInformation billInformation;
---all getters and setters----
}
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="BILLING_TAX_INFORMATION")
public class BillingTaxInformation {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "RECORD_ID", unique = true, nullable = false, length = 100)
private int recordNo;
@Column(name = "TAX_NAME", length = 100)
private String taxName;
@Column(name = "TAX_PERCENTAGE", length = 100)
private String taxInPercent;
@Column(name = "TAX_AMOUNT", length = 100)
private String taxAmount;
@ManyToOne
@JoinColumn(name="BILL_NO", nullable=false)
BillingInformation billInformation;
--------all getters and setters----
}
@OneToMany(fetch=FetchType.EAGER, mappedBy="billInformation"
, cascade = { CascadeType.PERSIST, CascadeType.REMOVE }
,orphanRemoval=true)
Set<BillingItemInformation> setBillingItemInformation;
@OneToMany(fetch=FetchType.EAGER, mappedBy="billInformation"
, cascade ={ CascadeType.PERSIST, CascadeType.REMOVE }
,orphanRemoval=true)
Set<BillingTaxInformation> setBillingTaxInformation;
发布所有实体的hashcode&equals方法。这可能是因为Id字段首次加载到集合中时可能为空。更新BillingInformation实例的代码在哪里?映射似乎没有问题。您的意思是可能是级联类型。删除?正确。。对于JPA,它应该被删除。。删除处于休眠状态annotation@Maciej我还想在更新父记录时更新子记录,但它应该更新现有记录,而不是为billingtaxinformation或billingiteminformation创建新记录编号。子实体的记录是否带有ID?那些ID已经在数据库中了吗?如何更新我想看到的代码这个答案似乎与OP的问题完全无关。
@Cascade({CascadeType.PERSIST, CascadeType.DELETE})