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