【问题标题】:Spring JPA: When I delete an entity, the entities related are deleted tooSpring JPA:当我删除一个实体时,相关的实体也会被删除
【发布时间】:2014-02-01 12:23:50
【问题描述】:

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

场景是这样的:有一个实体 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 进行了测试,然后实体没有被删除。

有谁知道我做错了什么?

提前感谢您的回答。

【问题讨论】:

    标签: java spring entity-framework jpa


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。我已删除 CascadeType.REMOVE 并由 cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE} 替换,现在未删除的 Usuario 实体。我要做的是删除 Usuario 实体,而不是 Role 实体...
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回答。我已删除 CascadeType.REMOVE 并由 cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE} 替换,现在未删除的 Usuario 实体。哪个是不删除角色实体的正确 CascadeType?
    【解决方案3】:

    解决了!

    提供的答案都是正确的:删除 CascadeType.ALL,但只是在 Role 实体中。通过此更改,可以删除一个 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>();
    ...
    

    谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 2011-03-25
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      相关资源
      最近更新 更多