如何删除链接的一对多和多对多JPA关系中的实体
我拥有如下实体链:如何删除链接的一对多和多对多JPA关系中的实体,jpa,spring-data-jpa,eclipselink,Jpa,Spring Data Jpa,Eclipselink,我拥有如下实体链: @Entity @Table(name = "Patients") public class Patient extends TimeStampedPersistable{ private static final long serialVersionUID = 1L; @OneToMany(mappedBy="patient", cascade = CascadeType.ALL) @PrivateOwned
@Entity
@Table(name = "Patients")
public class Patient extends TimeStampedPersistable{
private static final long serialVersionUID = 1L;
@OneToMany(mappedBy="patient", cascade = CascadeType.ALL)
@PrivateOwned
private List<Insurance> insurances;
}
@Entity
@Table(name = "insurance")
public class Insurance extends PersistableEntity {
private static final long serialVersionUID = 1L;
@ManyToOne(optional=false)
@JoinColumn(name="patient_id", nullable=false)
private Patient patient;
@Column(name = "policy_number", unique = false, nullable = true)
private String policyNumber;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinTable(name = "insurance_companycodes", joinColumns = {
@JoinColumn(name = "insurance_id", referencedColumnName = "id", nullable = false, updatable = false) }, inverseJoinColumns = {
@JoinColumn(name = "insuranceCompanyCode_id", referencedColumnName = "id", nullable = false, updatable = false) })
private Set<InsuranceCompanyCode> insuranceCompanyCodes = new HashSet<>();
}
@Entity
@Table(name = "insurance_company_codes")
public class InsuranceCompanyCode extends PersistableEntity {
private static final long serialVersionUID = 1L;
@Column(name = "identifier", unique = true, nullable = true)
private String identifier;
@ManyToMany(mappedBy = "insuranceCompanyCodes", fetch = FetchType.LAZY)
private Set<Insurance> insurances = new HashSet<>();
}
@实体
@表(name=“患者”)
公共类Patient扩展timestamesedpersistable{
私有静态最终长serialVersionUID=1L;
@OneToMany(mappedBy=“patient”,cascade=CascadeType.ALL)
@私有的
私人保险;
}
@实体
@表(name=“保险”)
公共类保险扩展持久性实体{
私有静态最终长serialVersionUID=1L;
@多通(可选=假)
@JoinColumn(name=“patient\u id”,nullable=false)
私家病人;
@列(name=“policy\u number”,unique=false,nullable=true)
私有字符串策略号;
@ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)
@JoinTable(name=“保险公司代码”,JointColumns={
@JoinColumn(name=“insurance\u id”,referencedColumnName=“id”,nullable=false,updateable=false)},inverseJoinColumns={
@JoinColumn(name=“insuranceCompanyCode\u id”,referencedColumnName=“id”,nullable=false,updateable=false)})
私有集insuranceCompanyCodes=new HashSet();
}
@实体
@表(名称=“保险公司代码”)
公共类保险公司代码扩展了PersistableEntity{
私有静态最终长serialVersionUID=1L;
@列(name=“identifier”,unique=true,nullable=true)
私有字符串标识符;
@ManyToMany(mappedBy=“insuranceCompanyCodes”,fetch=FetchType.LAZY)
私有集=新HashSet();
}
我需要从患者对象中删除保险项目。我正在使用以下代码:
for (Iterator<Insurance> iterator = patient.getInsurances().iterator(); iterator.hasNext();) {
iterator.next();
iterator.remove();
}
for(Iterator Iterator=patient.getInsurances().Iterator();Iterator.hasNext();){
iterator.next();
iterator.remove();
}
这似乎适用于没有子实体的子实体,但是在这种情况下,保险实体有子实体,并且没有实际删除(没有显示异常)。注意,我使用的是EclipseLink特定注释@PrivateOwned,我希望它会强制删除保险实体
感谢您的指导和建议 我本来希望它也能工作,但您有一个循环引用,当对象标识没有维护时,它可能会导致奇怪的事情。打开EclipseLink日志记录到finest并在获取保险列表时签出,并确保patient.insurances.get(i.patient==patient。否则,如果调用merge,它可能会将另一个患者实例强制放入持久性单元,从而导致两个列表之间的混淆。如果您在获取惰性关系之前读取患者并清除实体管理器,则可能会发生这种情况。或者您的意思是它仅适用于没有保险公司代码的保险?你没有任何东西告诉JPA在这种情况下该怎么做,而且由于InsuranceCompanyCode引用了cascade persist的保险,这种情况将使任何被删除的保险重新出现。在删除保险对象之前,需要清除这些引用。