Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringJPA:当我删除一个实体时,相关的实体也会被删除_Java_Spring_Entity Framework_Jpa - Fatal编程技术网

Java SpringJPA:当我删除一个实体时,相关的实体也会被删除

Java SpringJPA:当我删除一个实体时,相关的实体也会被删除,java,spring,entity-framework,jpa,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

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

场景是这样的:有一个实体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.ALL。

CascadeType.ALL还包括CascadeType.REMOVE,这就是使用此批注删除实体的原因。

CascadeType.ALL还包括CascadeType.REMOVE,这就是使用此批注删除实体的原因。

已解决

提供的答案都是正确的:删除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>();
...
谢谢

解决了

提供的答案都是正确的:删除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>();
...

谢谢

谢谢你的回答。我已经删除了CascadeType.REMOVE,并替换为cascade={CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.MERGE},现在还没有删除Usuario实体。我想做的是删除Usuario实体,而不是角色实体…谢谢你的回答。我已经删除了CascadeType.REMOVE,并替换为cascade={CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.MERGE},现在还没有删除Usuario实体。我想做的是删除Usuario实体,而不是角色实体…谢谢你的回答。我已经删除了CascadeType.REMOVE,并替换为cascade={CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.MERGE},现在还没有删除Usuario实体。哪种类型是不删除取消角色实体的正确类型?谢谢您的回答。我已经删除了CascadeType.REMOVE,并替换为cascade={CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.MERGE},现在还没有删除Usuario实体。哪种类型是不删除取消角色实体的正确类型?