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

无法删除具有ManyToOne关系的父实体

马高谊
2023-03-14

我正在用Java、Spring和JPA开发一个web应用程序。我有这两个实体,它们代表一个用户及其后续通知。当一个用户跟踪另一个用户时,被跟踪的用户将收到一个follow通知。

@Entity
public class User{
    @Id
    private Long userId;

    @OneToMany(mappedBy = "user",
            cascade = CascadeType.ALL,
            orphanRemoval = true)
    private List<Notification> notifications;
}

@Entity
public class FollowNotification{
    @Id
    private Long followNotificationId;

    @ManyToOne(
            fetch = FetchType.LAZY
    )
    @JoinColumn(name = "id")
    private User user;

    @ManyToOne
    private User follower;

}

我想删除User并删除它的所有通知,但我想保留通知的引用用户,也就是开始跟踪主用户的用户。唯一的问题是,当我尝试删除用户时,会出现以下错误:

com.mysql.jdbc.exceptions.jdbc4.mysqlintegrityConstraintViolationException:无法删除或更新父行:外键约束失败(database_name.follow_notification,constraintfk8ob9ie1tjkkon036uokkg52j2外键(follower_id)引用user(user_id)

我做错了什么?我如何删除一个用户,它的所有通知保持关系的另一边?

共有1个答案

景恩
2023-03-14

您有外键约束follower_id,它确保您不能删除通知引用的用户。在删除该用户之前,您需要将给定用户的所有通知的referenced user_id设置为null。

i)remove OphanRemove=true以及CascadeType.All(包含remove的CascadeType.All)指示删除操作应自动级联到User中该字段引用的实体对象(集合字段可以引用多个实体对象

@OneTomany(mappedBy=“user”)个人分发列表 通知

@joincolumn(name=“id”,nullable=true)专用用户用户;

iii)现在删除用户的代码如下所示

public void deleteUser(int id) {
 // code to get entity manager and then      
Query query = entitymanager.createQuery("Select u " + "from User u " + "where u.userId=+id");

      User user=query.getResultList( ).get(0);

      Set notifications= user.getNotification();
      Iterator<Notification> noteIterator = notifications.iterator();
        while (notification.hasNext()){
            Notification notification= noteIterator.next();
            notification.setUser(null); 
            } 
      entitymanager.remove(user);
    }
 类似资料:
  • 在使用Hibernate删除与子实体具有关系的JPA实体时,我遇到了一个问题,但是在使用EclipseLink而不是Hibernate作为JPA提供程序时,相同的代码可以正常工作。父实体上的批注是 当使用Hibernate时,它尝试将子实体上的join列设置为null,但由于该列不允许null而失败。使用EclipseLink时,它首先删除子实体,然后删除父实体,这是所需的行为。 我的问题是: 为

  • 我在一个实体上有一个简单的单向ManyToOne关系,不幸的是,这个关系是在一个我无法更改的模式中定义的。

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

  • 但是如果可能的话,我想避免这种情况,因为它迫使我定义n个构造函数,为我在投影中想要的n个字段组合定义n个构造函数。

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

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