【问题标题】:Deleting Parent setting Child values to NULL not deleting them删除父设置子值为 NULL 不删除它们
【发布时间】:2016-03-17 08:17:53
【问题描述】:

我有一个User 实体,它有一个角色列表。 当我删除 user 时,我希望子角色也会被删除。 但是,外键只是设置为 null 并且它没有被删除。您能否解释一下为什么会发生这种行为。我添加了CascadeType.ALL,我认为这会删除子角色。

User.java

@SerializedName("userrole")
@Expose
@OneToMany(mappedBy = "user", fetch=FetchType.EAGER, cascade = CascadeType.ALL)
private List<Role> userRoles = new ArrayList<Role>();

Role.java

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

@NotNull
private RoleEnum role;

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user")
private User     user;

删除后的表格

+----+------+------+
| id | role | user |
+----+------+------+
|  1 |    0 | NULL |
|  2 |    1 | NULL |
|  3 |    2 | NULL |
|  4 |    3 | NULL |
|  5 |    4 | NULL |
|  6 |    5 | NULL |
|  7 |    6 | NULL |
|  8 |    7 | NULL |
+----+------+------+

任何帮助将不胜感激。

【问题讨论】:

  • 请不要从Role.usercascade = CascadeType.ALL。您可能不想删除用户,以防它的角色之一被删除。
  • 感谢您指出这一点@NándorElődFekete

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


【解决方案1】:

您可以使用orphanRemoval 属性来实现此目的。引用 JPA 2.0 规范中的相关部分。

指定为 OneToOne 或 OneToMany 的关联支持使用 orphanRemoval 选项。当 orphanRemoval 生效时,以下行为适用:

如果从关系中删除作为关系目标的实体(通过设置 关系为 null 或从关系集合中删除实体),删除操作 将应用于被孤立的实体。删除操作在 冲洗操作。 orphanRemoval 功能适用于私有实体 由其母公司“拥有”。便携式应用程序不得依赖于 删除的特定顺序,并且不得将已孤立的实体重新分配给另一个实体 关系或以其他方式试图维持它。如果被孤立的实体是分离的、新的、 或删除的实体,orphanRemoval 的语义不适用。

如果删除操作应用于托管源实体,则删除操作将 根据第 3.2.3 节的规则级联到关系目标,(因此它是 不必为关系指定 cascade=REMOVE

所以你的OneToMany 注释看起来像,

@OneToMany(mappedBy = "user", fetch=FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval=true)

【讨论】:

    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多