【问题标题】:JPA one-to-many delete and set foregn key to nullJPA一对多删除并将外键设置为null
【发布时间】:2013-03-22 11:01:32
【问题描述】:

我使用 Spring Data、JPA、Hibernate 和 MySQL。我在事件和类别之间有一对多的关系。显然,一个事件只能有一个类别,而一个类别可以分配多个事件。当我尝试删除类别时出现问题,如果任何事件持有此类别的外键,那么我会收到错误消息。我想在删除类别时将事件表中的外键设置为空。目前,我通过在代码中显式设置外键来更新所有事件,方法是在删除类别之前将其更新为 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;
    }
    }

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

【问题讨论】:

    标签: mysql hibernate jpa one-to-many


    【解决方案1】:

    1-最好的办法是写cascade = CascadeType.DETACH

    2- 但你应该写在 Class Event 上面

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

    3- 事件类内部

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

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

    【讨论】:

      【解决方案2】:

      不幸的是,目前无法使用 JPA/Hibernate 注释来做到这一点。请参阅以下相关问题:

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

      On delete set null in hibernate in @OneToMany

      【讨论】:

      • 嗨大卫,感谢您的回答。您的回答刚刚证实我是正确的。我使用的方法与您提供的链接完全相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 2021-05-23
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多