JPA一对多删除并将外键设置为null

时间:2013-04-01 11:08:34

标签: mysql hibernate jpa one-to-many

我使用Spring Data,JPA,Hibernate和MySQL。事件和类别之间有一对多的关系。显然,一个事件只能有一个类别,一个类别可以分配许多事件。当我尝试删除Category时出现问题,如果任何事件持有此类别的外键,则会出现错误。我想在删除类别时将Event表中的外键设置为null。目前,我通过在删除Category之前将其更新为null,在代码中显式设置外键来更新所有事件。有没有办法使用注释?

这是我的类别:

    @Entity
    @Table(name = "category")
    public class Category implements Serializable{
    @OneToMany(mappedBy="category", targetEntity=Event.class, fetch=FetchType.LAZY, cascade=
{CascadeType.DETACH,  CascadeType.MERGE,  CascadeType.PERSIST, CascadeType.REFRESH})

    public Set<Event> getEvents_category() {
    return events_category;
    }
    }

和Event类:

@Entity
   @Table(name = "event")
   public class Event implements Serializable{

    @ManyToOne(cascade={CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST,
CascadeType.REFRESH})
    @JoinColumn(name="events_dancestyle")
    public DanceStyle getDanceStyle() {
    return danceStyle;
    }
    }

我已经看过很多次讨论这个话题,但我没有看到任何解决方案。

2 个答案:

答案 0 :(得分:6)

不幸的是,目前无法使用JPA / Hibernate注释来实现此目的。请参阅以下相关问题:

Have JPA/Hibernate to replicate the "ON DELETE SET NULL" functionality

On delete set null in hibernate in @OneToMany

答案 1 :(得分:0)

1-最好的方法是编写级联= CascadeType.DETACH

2-但您应该在课程事件上方写上

@SQLDelete(sql = "UPDATE event SET deleted=true WHERE id=?")

3-在事件类中

@Column(columnDefinition = "boolean default false")
    private boolean deleted;

4-然后删除类别 如果CascadeType.AL1,则事件实体的“已删除”属性将受到1(true)的影响。 如果CascadeType.DETACH事件实体的“已删除”属性不受影响,则仍为0(假)。