删除关系OneToMany双向记录?

时间:2014-08-11 06:03:55

标签: java hibernate jpa one-to-many many-to-one

我正在寻找如何删除关系OneToMany / ManyToOne的注册表。 问题是,当我执行EntityManager.remove()时,所有记录都被删除,我希望只删除子(DiasTurma),而不是你的父(Turma)。

这里我正在尝试

// parent
@Entity
public class Turma implements Serializable{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Integer id;

    @NotNull @Column(unique = true)
    private String turmaNome;    

    @OneToMany(mappedBy = "turma", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<DiasTurma> diasTurma = new ArrayList<DiasTurma>();
    //gets/sets


//child
@Entity
public class DiasTurma implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id @GeneratedValue
    private Integer id;

    private String horaInicio;
    private String horaFim;
    private String diaSemana;

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @JoinColumn(name = "id_turma")
    private Turma turma;
    //gets/sets


// DAO
/** remove DiasTurma of Turma */
public void removeDiasTurma(){
        DiasTurma dias = (DiasTurma)em.find(DiasTurma.class, 3);
        em.getTransaction().begin();
        em.remove(dias);
        em.getTransaction().commit();
        em.close();
    }

方法removeDiasTurma()执行删除操作,但删除包括Turma记录在内的所有记录。

如何仅删除记录3?

1 个答案:

答案 0 :(得分:1)

  

问题是,当我执行EntityManager.remove()时,所有记录都被删除,我希望只删除子(DiasTurma),而不是你的父(Turma)

发生这种情况是因为你明确要求删除级联:

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 

由于您指定了cascade = ALL,因此在DiasTurma上完成的每个操作(包括remove())都会级联到其父Turma。