Spring JPA:删除实体时,相关的实体也会被删除

时间:2014-02-01 12:23:50

标签: java spring entity-framework jpa

首先,感谢您对这个问题感兴趣。

场景是这样的:有一个实体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,然后实体不会被删除。

有谁知道我做错了什么?

提前感谢您的回答。

3 个答案:

答案 0 :(得分:2)

你没有做错任何事。您指定CascadeType.ALL,这意味着所有操作(包括删除)都会级联到相关实体。如果您不希望这种情况发生,请不要使用CascadeType.ALL

答案 1 :(得分:2)

CascadeType.ALL也包括CascadeType.REMOVE,这就是为什么您的实体会被这个注释删除。

答案 2 :(得分:0)

解决!

提供的答案都是正确的:删除CascadeType.ALL,但只是在角色实体。通过此更改,可以删除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
        )
@JoinTable(
        name = "marte_usuario_role", 
        joinColumns = { @JoinColumn(name = "role_id") }, 
        inverseJoinColumns = { @JoinColumn(name = "usuario_id") })
@JsonIgnore
private List<Usuario> users = new ArrayList<Usuario>();
...

谢谢!