Zmapowana lista po usunięciu elementu(encji) nie aktualizuje listy

0

Wytłumaczę dokładnie całą sytuację.
Mam encję reprezentującą zaproszenie do znajomych.

public class InvitationEntity {
...
    @ManyToOne
    @JoinColumn(name = "from_user_id", nullable = false)
    private UserEntity fromUser;

    @ManyToOne
    @JoinColumn(name = "to_user_id", nullable = false)
    private UserEntity toUser;
...
}

Encja użytkownika mapuję tą encję na dwa sposoby.

@OneToMany(mappedBy = "fromUser", orphanRemoval = true, cascade = CascadeType.ALL)
private List<InvitationEntity> sentInvitations; // lista wysłanych zaproszeń
@OneToMany(mappedBy = "toUser", orphanRemoval = true, cascade = CascadeType.ALL)
private List<InvitationEntity> receivedInvitations; // lista odebranych zaproszeń

Użytkownik A wysyła zaproszenie do użytkownika B. Tworzę encję zaproszenia i dodaję ją do listy wysłanych zaproszeń użytkownika A.

public void createInvitation(
        final Long fromId,
        final Long toId
) {
    final UserEntity A = this.findUser(fromId);
    final UserEntity B = this.findUser(toId);

    A.getSentInvitations().add(new InvitationEntity(A, B));
}

Następnie po odczytaniu okazuje się, że lista wysłanych zaproszeń użytkownika A (a.getSentInvitations()) posiada to zaproszenie, jak również użytkownik B (b.getReceivedInvitations()) posiada to zaproszenie na liście odebranych zaproszeń.

Jednak użytkownika A postanowił anulować zaproszenie i je usunął. Usuwam zaproszenia z list użytkownik A i B, bo jeśli usunę zaproszenie tylko z listy wysłanych zaproszeń użytkownika A, to użytkownik B będzie dalej posiadał zaproszenia na liście odebranych zaproszeń, mimo, że tego zaproszenia nie ma już w bazie.

public void deleteInvitation(
        final Long fromId,
        final Long toId
) {
    final UserEntity A = this.findUser(fromId);
    final UserEntity B = this.findUser(toId);

    final Optional<InvitationEntity> invitation = this.invitationRepository.findOneByAAndB(A, B);

    A.getSentInvitations().remove(invitation.get());
    B.getReceivedInvitations().remove(invitation.get());
}

Dotąd wszystko jest OK.

Problem pojawia się teraz. Użytkownik A rozmyślił i postanowił znowu zaprosić użytkownika B. Więc znowu użył metody

createInvitation(...);

do wysłania zaproszenia. Jednak efekt jest już inny. Za pierwszy razem takie dodanie zaproszenia na listę wysłanych zaproszeń użytkownika A, powodowało również, że to zaproszenie było na liście odebranych zaproszeń użytkownika B. Ale nie tym razem. Zaproszenie jest tylko na liście wysłanych zaproszeń użytkownika A, ale nie ma go na liście odebranych zaproszeń użytkownika B. Dlaczego? Zaproszenie będzie na liście odebranych zaproszeń użytkownika B, jeśli na nowo skompiluję program. Prawdopodobnie ta sytuacja wynika z tego, że był z listy usuwany element, ale więcej nie wiem.

0

Dlaczego nie korzystasz z InvitationRepository, aby dodawać i usuwać te zaproszenia? W twoim przypadku nieptorzebnie pobierasz aktualne zaproszenia, kiedy chcesz je dodać.
Zobacz co się dzieje na bazie podczas każdego z tych scenariuszy.

0

Ponieważ za pomocą InviationReposiory usunę zaproszenie z bazy, ale użytkownicy w buforach będą nadal mieli to zaproszenie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1