2012-05-03 28 views
9

Tôi đang gặp khó khăn trong việc xóa trẻ em khỏi hiệp hội OneToMany. các đơn vị của tôi:Xóa trẻ em khỏi @ OneToMany-hiệp hội: CascadeType.ALL + orphanRemoval = true không hoạt động

@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; 
    ... 

nỗ lực không thành công của tôi để xóa các Childs:

personEntity.getProjects().clear(); 

này hoạt động, nhưng tôi không nghĩ rằng thats cách tiếp cận đúng:

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

Tôi đang làm gì sai ở đây?

Cảm ơn
Jonny

Trả lời

14

Hội là hai chiều, và phía sở hữu của một hiệp hội hai chiều là một trong những nơi không có thuộc tính mappedBy. Điều này có nghĩa là trong trường hợp này, bên sở hữu là bên dự án.

Hibernate chỉ xem xét bên sở hữu để biết liệu liên kết có tồn tại hay không. Điều này có nghĩa là để phá vỡ mối liên hệ giữa một người và một dự án, bạn phải đặt người đó thành null trong dự án.

+0

Cảm ơn JB Nizet, điều này đã thực hiện thủ thuật. Ở đây mã: 'cho (Iterator iterator = personEntity.getProjects(). Iterator(); iterator.hasNext();) { ProjectEntity projectEntity = iterator.next(); projectEntity.setPerson (null); iterator.remove(); } ' – user871611

+0

Điều gì sẽ xảy ra nếu người đó không thể vô hiệu? –

+0

@IgorG. Nếu người đó không thể là null, thì sẽ không có ý nghĩa gì khi xóa liên kết. –

Các vấn đề liên quan