![](/img/trans.png)
[英]When I delete an entity, the entities related are deleted and get an error
[英]Spring JPA: When I delete an entity, the entities related are deleted too
首先,感谢您对此问题感兴趣。
场景是这样的:有一个具有多个角色的实体Usuario(用户)。 删除用户时,所有与之相关的角色也将被删除。
角色的代码是:
@Entity
@Table(name = "marte_role")
@XmlRootElement
public class Role implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String nombre;
@ManyToMany(
fetch = FetchType.EAGER,
targetEntity = Usuario.class,
cascade = { CascadeType.ALL })
@JoinTable(
name = "marte_usuario_role",
joinColumns = { @JoinColumn(name = "role_id") },
inverseJoinColumns = { @JoinColumn(name = "usuario_id") })
@JsonIgnore
private List<Usuario> users = new ArrayList<Usuario>();
... Getters/setters/builders...
Usuario的代码是:
@Entity
@Table(name = "marte_usuario")
@XmlRootElement
public class Usuario implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String username;
private String password;
private String email;
private boolean enabled;
@ManyToMany(
fetch = FetchType.EAGER
, targetEntity = Role.class
, cascade = { CascadeType.ALL })
@JoinTable(
name = "marte_usuario_role"
, joinColumns = { @JoinColumn(name = "usuario_id") }
, inverseJoinColumns = { @JoinColumn(name = "role_id") })
private List<Role> roles = new ArrayList<Role>();
@Transient
private int numRoles;
在我看来,这与CascadeType.ALL有关。 我已经使用CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.MERGE(而不是CascadeType.ALL)进行了测试,然后不删除该实体。
有人知道我在做什么错吗?
预先感谢您的回答。
你没做错什么 您指定CascadeType.ALL
,这意味着所有操作(包括删除)都将级联到相关实体。 如果您不希望这种情况发生,请不要使用CascadeType.ALL
。
CascadeType.ALL
还包括CascadeType.REMOVE
,这就是为什么使用此批注删除实体的原因。
解决了!
提供的答案都是正确的:删除CascadeType.ALL, 但仅在Role实体中 。 通过此更改,可以删除Usuario,而无需删除所有与Role相关的角色。
@Entity
@Table(name = "marte_role")
@XmlRootElement
public class Role implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String nombre;
@ManyToMany(
fetch = FetchType.EAGER,
targetEntity = Usuario.class
)
@JoinTable(
name = "marte_usuario_role",
joinColumns = { @JoinColumn(name = "role_id") },
inverseJoinColumns = { @JoinColumn(name = "usuario_id") })
@JsonIgnore
private List<Usuario> users = new ArrayList<Usuario>();
...
谢谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.