当前位置: 首页 > 知识库问答 >
问题:

ManyToMany关系删除所有实体

宋伟泽
2023-03-14

我有两个实体,用户和电影。他们是很多双向的关系。我的问题是,当我通过我的控制器删除一部电影时,它也会删除所有与该电影相关的实体。My user和this user角色和movie实体。我要做什么,从表中删除电影实体,并保持用户与他的角色,而不是删除他们所有。

@Data
@ToString
@EqualsAndHashCode
@Entity
@Table(name = "movies")
public class Movie {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "title")
    private String title;
    @Column(name = "description")
    private String description;
    @Column(name = "release_date")
    @Temporal(TemporalType.DATE)
    private Date release_date;
    @Column(name = "country")
    private String country;
    @Column(name = "category")
    private String category;
    @ManyToMany(mappedBy = "movies")
    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    private Set<User> users = new HashSet<>();

@Data
@ToString
@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "username")
    private String username;
    @Column(name = "password")
    private String password;
    @Transient
    private String confirmPassword;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "users_roles", joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")})
    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    private Set<Role> roles = new HashSet<>();

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "users_movies", joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "movie_id", referencedColumnName = "id")})
    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    private Set<Movie> movies = new HashSet<>();

共有1个答案

谷梁向荣
2023-03-14

这是使用CascadeType.all时的预期行为,它隐式地包括CascadeType.Remove-在删除拥有实体时删除所有相关实体。

由于您在关联的两边都使用了cascadetype.all,因此您删除的记录超过了您实际想要的。

要避免这种情况:

  • 您需要删除CascadeType.All或将其更改为适当的内容,如Merge/Persist
  • 自行处理实体的删除。
  • 请考虑使用批删除选项指定关联的实体ID。
 类似资料:
  • 问题内容: 在一个模型中,我有这个: 如果我选择: 有用。 如何从关系中删除所有对象?不管用。 问题答案: 首先,你需要使用或来清除关系,根据docs,哪种更适合你的需求。 之后,你需要使用删除对象。方法。

  • 在我的Spring/MySql系统中,我有一些Jpa实体,它们通过父关系上的joinTable在OneToMany关系中连接。在这种情况下,一个帖子有很多评论。 如果我尝试删除Post实体,问题是生成的SQL试图删除仍在连接表中的注释,从而触发外键冲突。 什么是正确的方法: 删除连接表项 删除连接表左侧父关系实体 删除连接表右侧子关系实体 要记住的一些事情: 还有其他实体通过oneTo多项关系拥有

  • 我有这些实体: 用户 角色 权限 一个用户有很多角色,一个角色有很多权限。 null

  • 我在JPA中定义了两个实体:Employee和Skill。 在这些实体之间定义了relationship@ManyTomany。 现在我有这样的问题:如果我删除技能实体使用实体管理器。它移除OK。但是在@jointable中,在数据库employee_skill中,仍然存在与这个被删除的实体(其id)的关联。 我不想在移除技能时移除员工,所以所有的级联移除或孤立移除在这里都不有用。 我考虑了为什么

  • 问题内容: 我希望UserAcounts可以有许多UserGroups,而所有Groups可以有许多Users。还有一个联接表。我希望在删除useraccount时删除联接表中useraccount和usergroup之间的关系。 实际上,我想使用“在删除级联上”。在ManyToMany关系中,我不会不幸地运行它。我已经尝试了很多事情,但没有找到解决方案。 注意:我只想在删除级联上删除关系 是否有

  • 我的两个实体有一对一的关系 我尝试通过此方法删除我的用户实体 PasswordResetTokenRepository类,我在服务方法中调用了该类,用于删除用户,我使用了常规Hibernate方法deleteById(Long id) 但是当我尝试通过此方法删除时,出现此错误:not-null 属性引用 null 或瞬态值:kpi.diploma.ovcharenko.entity.user.Pa