删除父设置子值为NULL而不删除它们

时间:2016-03-16 23:59:35

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

我有一个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 |
+----+------+------+

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用orphanRemoval属性实现此目的。引用JPA 2.0 Spec。

中的相关部分
  

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

     

如果从关系中删除了作为关系目标的实体(通过设置   关系为null或从关系集合中删除实体),删除操作   将被应用于孤儿的实体。删除操作在时间应用   冲洗操作。 orphanRemoval功能适用于私有实体   &#34;资&#34;由他们的父实体。否则便携式应用程序必须不依赖于   特定的删除顺序,不得将已经孤立的实体重新分配给另一个实体   关系或以其他方式试图坚持下去。如果孤立的实体是一个分离的,新的,   或者删除实体,orphanRemoval的语义不适用。

     

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

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

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