Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除链接的一对多和多对多JPA关系中的实体_Jpa_Spring Data Jpa_Eclipselink - Fatal编程技术网

如何删除链接的一对多和多对多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的保险,这种情况将使任何被删除的保险重新出现。在删除保险对象之前,需要清除这些引用。