2012-05-03 7 views
9

OneToMany-associationから子を削除するのに苦労します。私のエンティティ:チャイルズを削除する@ OneToMany-associationから子を取り除く:CascadeType.ALL + orphanRemoval = true not working

@Entity 
@Table(name = "PERSON") 
public class PersonEntity extends BaseVersionEntity<Long> implements Comparable<PersonEntity> 
{ 
    ... 
    // bi-directional many-to-one association to Project 
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "person", orphanRemoval = true) 
    private final Set<ProjectEntity> projects = new HashSet<ProjectEntity>(); 
    ... 

@Entity 
@Table(name = "PROJECT") 
public class ProjectEntity extends BaseVersionEntity<ProjectPK> 
{ 
    @EmbeddedId 
    private ProjectPK id; 
    ... 
    // bi-directional many-to-one association to UdbPerson 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "PERSON_ID", nullable = false, insertable = false, updatable = false) 
    private PersonEntity person; 
    ... 

@Embeddable 
public class ProjectPK implements Serializable 
{ 
    // default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    @NotNull 
    @Column(name = "PERSON_ID") 
    private Long personId; 
    ... 

私の失敗した試行:

personEntity.getProjects().clear(); 

これは動作しますが、私は右のアプローチthatsのとは思わない:私は

for (Iterator<ProjectEntity> iterator = personEntity.getProjects().iterator(); iterator.hasNext();) 
{ 
    ProjectEntity projectEntity = iterator.next(); 
    projectDao.deleteEntity(projectEntity); 
    iterator.remove(); 
} 

何をしていますここで間違っている?

おかげ
ジョニー

答えて

14

関連は双方向性であり、かつ双方向関連の所有側にはmappedBy属性が存在しないものです。これは、この場合、所有側がプロジェクト側であることを意味します。

Hibernateは、所有側が関連が存在するかどうかを知ることのみを考慮します。つまり、人とプロジェクトの関連付けを解除するには、その人物をプロジェクトのnullに設定する必要があります。

+0

JB Nizetさん、ありがとう、これはトリックでした。ここでコードは: 'for(Iterator iterator = personEntity.getProjects()。iterator(iterator.hasNext();) { ProjectEntity projectEntity = iterator.next(); projectEntity.setPerson(null); iterator.remove(); } ' – user871611

+0

人がnullでない場合はどうなりますか? –

+0

@IgorG。 personがnullにできない場合、関連を削除するのは意味がありません。 –

関連する問題