【问题标题】:Spring Boot JPA One To Many relation - deleting does not workSpring Boot JPA 一对多关系 - 删除不起作用
【发布时间】:2021-02-05 08:05:42
【问题描述】:

我正在处理一个问题。我有一对多的关系,就我而言,它看起来像这样:


@Data
@Entity
public class Event {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String title;
    ...
    @OneToMany(mappedBy = "event", cascade = ALL)
    List<TimePeriod> dates;

TimePeriod 实体如下所示:

@Entity
@Data
public class TimePeriod {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    ...
    @ManyToOne
    private Event event;
}

我的 JPA 存储库如下所示:

@Repository
public interface TimePeriodRepository extends JpaRepository<TimePeriod, Long>
{
}

当我执行以下代码时:

event.getDates().stream().forEach(d -> {
            timePeriodRepository.deleteById(d.getId());
        });

我没有看到记录已从数据库中删除。他们还在那里。我了解 TimePeriod 在我的情况下拥有一方,所以我知道它应该可以工作。

我操作主要是od事件实体,为什么我放了cascade.ALL选项。

但是当我在 TimePeriod 上也有 cascade.ALL 时,不仅相关记录被删除,而且 EVENT 也被删除。

我尝试过的另一种方法是更新事件端,例如:

event.setDates(new ArrayList());

但是当我保存事件之后,我仍然能够在数据库中看到这些日期记录。

谁能告诉我我做错了什么?

【问题讨论】:

  • 所以TimePeriod的实例不会被删除,对吧?
  • 是的,还在数据库中

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


【解决方案1】:

但是当我在 TimePeriod 上也有 cascade.ALL 时,不仅相关记录被删除,而且 EVENT 也被删除。

CascadeType.ALL 的含义是持久化会将所有操作(PERSIST、REMOVE、REFRESH、MERGE、DETACH)传播到相关实体。

我认为你应该尝试orphanRemoval

【讨论】:

    【解决方案2】:

    Delete Not Working with JpaRepository 会回答您的问题吗?您的双向引用情况看起来很相似。

    【讨论】:

      【解决方案3】:

      您是否在删除日期时检查了 DataIntegrityViolationException?

      您应该尝试从事件中删除所有日期,保存事件,然后删除每个 TimePeriod 实例:

      List<TimePeriod> dates = event.getDates();
      event.setDate(List.of());
      eventRepository.merge(event);
      dates.stream().forEach(d -> {
          timePeriodRepository.deleteById(d.getId());
      });
      

      【讨论】:

      • 我没有看到任何异常,例如数据完整性。但是当我喜欢你的时候,建议它起作用了。我总是需要更新两个方面吗?我认为它可以由一侧完成,不是吗?
      • 当您不希望发生级联行为时,您需要这样做。
      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      相关资源
      最近更新 更多