Java 删除父项将子项值设置为NULL不删除它们

Java 删除父项将子项值设置为NULL不删除它们,java,hibernate,jpa,one-to-many,many-to-one,Java,Hibernate,Jpa,One To Many,Many To One,我有一个用户实体,它有一个角色列表。 当我删除用户时,我希望子角色也会被删除。 但是,外键只是设置为null,并且它没有被删除。你能解释一下为什么会发生这种行为吗。我添加了CascadeType.ALL,我认为这会删除子角色 User.java @SerializedName("userrole") @Expose @OneToMany(mappedBy = "user", fetch=FetchType.EAGER, cascade = CascadeType.ALL) private Lis

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

User.java

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

任何帮助都将不胜感激。

您可以使用
属性来实现这一点。引用JPA2.0规范中的相关部分

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

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

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

因此,您的
OneToMany
注释如下所示:


@OneToMany(mappedBy=“user”,fetch=FetchType.EAGER,cascade=CascadeType.ALL,orphandremovation=true)
请不要执行
cascade=CascadeType.ALL
来自
Role.user
的操作。如果用户的某个角色被删除,您可能不想删除该用户。感谢您指出@NándorElődFekete