" orphanRemoval = true"删除操作时不删除子对象

时间:2015-08-20 06:46:37

标签: java hibernate jpa orm hibernate-mapping

以下两个类(CD和DVD)彼此无关。每个都有不同的表。但是它们都有像Address这样的子类。

在保存DVD / CD的值时,条目将插入相应的表中。因此,当我尝试在Address_Table中添加值时,它正在使用CD&的主键正确插入。 DVD。

当我试图删除Address_Table中的条目时,它不会被删除 我认为通过使用" orphanRemoval = true"没有用。

对于这个场景,任何相关的注释都要使用?因为在使用xml文件时它工作正常。

// DVD类

@Entity
@Table(name="DVD_Table")
public class DVDPO{

    //some code

    @OneToMany(fetch = FetchType.LAZY,targetEntity=com.AddressPO.class,cascade=CascadeType.ALL, orphanRemoval = true)
    @MapKeyColumn(name="LOG_GUID")
    @JoinColumn(name = "FK_GUID")
    private Map<String, PersistentObject> auditEntry = new HashMap<String, PersistentObject>();

}

// CD class

@Entity
@Table(name="CD_Table")
public class CDPO{

    //some code

    @OneToMany(fetch = FetchType.LAZY,targetEntity=com.AddressPO.class,cascade=CascadeType.ALL, orphanRemoval = true)
    @MapKeyColumn(name="LOG_GUID")
    @JoinColumn(name = "FK_GUID")
    private Map<String, PersistentObject> auditEntry = new HashMap<String, PersistentObject>();

}

//地址类

@Entity
@Table(name="Address_Table")
public class AddressPO{

    @Any(metaColumn = @Column(name = "CLASS_NAME"), fetch = FetchType.EAGER)
    @AnyMetaDef(idType = "java.lang.String", metaType = "string", metaValues = {
            @MetaValue( targetEntity = com.DVDPO.class, value = "DVD"),
            @MetaValue(targetEntity = com.CDPO.class, value = "CD"),    

   @JoinColumn(name="FK_GUID")
   private PersistentObject persistentObject;
}

1 个答案:

答案 0 :(得分:0)

要删除AddressPO,您必须将其与与当前Session关联的DVDPO和CDPO对象取消关联。

PersistentObject po = ...;
DVDPO dvdpo = ...;
CDPO cdpo = ...;
dvdpo.getAuditEntry().values().remove(po);
cdpo.getAuditEntry().values().remove(po);