2012-05-03 9 views
9

Tengo dificultades para eliminar elementos secundarios de OneToMany-association. Mis entidades:Eliminar elementos secundarios de @ OneToMany-association: CascadeType.ALL + orphanRemoval = true no funciona

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

Mi intento fallido de eliminar los Niños:

personEntity.getProjects().clear(); 

Esto funciona, pero no creo que ese es el enfoque correcto:

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

¿Qué estoy haciendo mal aquí?

Gracias
Jonny

Respuesta

14

La asociación es bidireccional, y el lado propietario de una asociación bidireccional es en la que no hay ningún atributo mappedBy. Esto significa que en este caso, el lado propietario es el lado del proyecto.

Hibernate solo considera el lado propietario para saber si la asociación existe o no. Esto significa que para romper la asociación entre una persona y un proyecto, debe configurar a la persona en null en el proyecto.

+0

Gracias JB Nizet, esto hizo el truco. Aquí el código: 'for (Iterator iterator = personEntity.getProjects(). Iterator(); iterator.hasNext();) { ProjectEntity projectEntity = iterator.next(); projectEntity.setPerson (null); iterator.remove(); } ' – user871611

+0

¿Qué pasa si la persona no puede ser nula? –

+0

@IgorG. Si la persona no puede ser nula, entonces no tiene sentido eliminar la asociación. –

Cuestiones relacionadas