【问题标题】:Java Spring Repository delete not working OneToMany RelationshipJava Spring Repository 删除不起作用的 OneToMany 关系
【发布时间】:2017-05-08 10:34:38
【问题描述】:

我在删除 ManyToOne 关系的多方时遇到问题。我已经从关系中删除了所有 CascadeTypes,但问题仍然存在。该条目不会被删除(仅执行选择,不执行删除查询)。我正在尝试通过 CRUD 存储库调用删除它来删除它。它调用该方法并成功执行,但没有任何反应。

关系如下:一个活动有一个分配的课程,一个课程可以有许多活动分配给它。一个 Activity 有一个特定的 ActivityType。

类如下。

活动

public class Activity implements Item, Serializable {

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

    ...

    @ManyToOne
    @JoinColumn(name = "type_id", nullable = false)
    private ActivityType type;

    @ManyToOne
    @JoinColumn(name = "course_id", nullable = false)
    @JsonSerialize(using = CustomCourseSerializer.class)
    private Course course;

    ...
}

课程

public class Course implements Item, Serializable {

...

@OneToMany(mappedBy = "course", fetch = FetchType.EAGER, targetEntity = Activity.class) //cascade = { CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH, CascadeType.REMOVE}
@Fetch(value = FetchMode.SUBSELECT)
private List<Activity> activities;

...
}

Activity 类型(没有引用 Activity)

public class ActivityType implements Item, Serializable {

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

@Column(name = "name", nullable = false, unique = true)
private String name;
...
}

任何想法如何解决这个问题或至少调试它?谢谢。

【问题讨论】:

  • 你试过orphanRemoval = true吗?
  • 我已将 orphanRemoval 添加到课程结束,但没有任何改变。此外,这不是理想的行为(在我删除活动时删除课程)。或者您是指将其添加到 Activity 部分?
  • 如果你想删除子Activity,你必须在Course类中添加@OneToMany(orphanRemoval = true)。如果删除了Activity,这不会删除您的Course
  • 我尝试添加 `orphanRemoval = true` 但没有结果。我仍然无法删除 Activity。
  • 请在您删除Activity 实体的位置发布一些代码。

标签: java database spring sql-delete many-to-one


【解决方案1】:

Course 实体的@OneToMany 注释中添加orphanRemoval = true 属性。

public class Course implements Item, Serializable {

    ...

    @OneToMany(mappedBy = "course", fetch = FetchType.EAGER, targetEntity = Activity.class, orphanRemoval = true, cascade = CascadeType.REMOVE )
    @Fetch(value = FetchMode.SUBSELECT)
    private List<Activity> activities;

    ...

}

【讨论】:

  • 我还添加了这个 cascade = { CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH, CascadeType.REMOVE} 以使其正常工作。
  • 为什么不加cascade = CascadeType.ALL
  • 由于某种原因,ALL 中包含的 CascadeType.PERSIST 会阻止删除的发生。也许这是一个 ORM 数据上下文的事情,我不确定。
【解决方案2】:

尝试从Course 中删除对Activity 的引用。对我来说似乎没有必要

【讨论】:

  • 我从Course 中删除了对Activity 的引用,但它仍然不起作用。
猜你喜欢
  • 2015-11-03
  • 2014-08-02
  • 2012-01-08
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 2018-05-21
  • 2021-02-05
  • 2016-09-03
相关资源
最近更新 更多