Невозможно удалить родительский объект с отношением ManyToOne - PullRequest
2 голосов
/ 14 января 2020

Я разрабатываю веб-приложение с Java, Spring и JPA. У меня есть эти две сущности, которые представляют пользователя и его последующие уведомления. Когда пользователь следует за другим пользователем, тот, кто подписан, получает уведомление о подписке.

@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;

}

Я хочу удалить Пользователя и удалить также все его уведомления, но я хочу сохранить ссылочного пользователя уведомления , который является тем, кто начал следовать за главным пользователем. Единственная проблема заключается в том, что когда я пытаюсь удалить пользователя, я получаю эту ошибку:

com. mysql .jdb c .exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Невозможно удалить или обновить родительскую строку : ограничение внешнего ключа не выполняется (database_name. follow_notification, CONSTRAINT FK8ob9ie1tjkkon036uokkg52j2 ИНОСТРАННЫЙ КЛЮЧ (follower_id) ССЫЛКИ user (user_id))

Что я делаю неправильно ? Как я могу удалить Пользователя со всеми его уведомлениями, сохраняя другую сторону отношений?

1 Ответ

1 голос
/ 14 января 2020

у вас есть ограничение внешнего ключа follower_id, которое гарантирует, что вы не можете удалить пользователя, на который ссылаются уведомления. Вам нужно установить нулевой идентификатор пользователя, на который ссылаются, для всех уведомлений для данного пользователя на многих сторонах перед удалением пользователя.

i) remove orphanRemoval = true, а также CascadeType.ALL (CascadeType.ALL, который включает REMOVE) указывает, что операции удаления должны автоматически каскадно обращаться к объектам сущности, на которые ссылается это поле (на несколько объектов сущности может ссылаться поле сбора)) в User

@OneToMany(mappedBy = "user") private List<Notification> notifications;

ii), а также добавьте nullable = true для пользователя в FollowNotification, т. е.

@JoinColumn(name = "id",nullable = true) private User user;

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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...