Неожиданные дубликаты в списке @OneToMany - PullRequest
0 голосов
/ 28 февраля 2020

Я занимаюсь разработкой веб-приложения с использованием Spring Boot и JPA. У меня есть класс User, у которого, как и в социальной сети, могут быть подписчики и подписчики. Я подумал, что лучший способ реализовать это - создать класс (FollowRelationship), в котором два пользователя следуют, а другой следует. Таким образом, в каждом классе User должно быть два объекта списка FollowRelatioship с различным отображением: один для последователей, а другой для следующих. Но я думаю, что дело яснее, если взглянуть на код.

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer userId;

    @OneToMany(mappedBy="to", cascade = CascadeType.ALL, orphanRemoval=true)
    private List<FollowRelationship> followers = new ArrayList<>();

    @OneToMany(mappedBy="from", cascade = CascadeType.ALL, orphanRemoval=true)
    private List<FollowRelationship> followings = new ArrayList<>();
...
}

И класс FollowRelationship:

@Entity
public class FollowRelationship {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long followRelationshipId;
    private Date date;

    @ManyToOne
    @JoinColumn(name = "from_id")
    @JsonIgnore
    private User from;

    @ManyToOne
    @JoinColumn(name = "to_id")
    @JsonIgnore
    private User to;

    public FollowRelationship(Date date, User from, User to) {
       this.date = date;
       this.from = from;
       this.to = to;
    }

...

}

Метод, используемый для создания FollowRelationship, следующий:

@Override
public void follow(Long followerId, Long followedId) throws UserNotFoundException {
    User follower = getByUsername(followerId);
    User followed = getByUsername(followedId);
    follower.addFollowing(new FollowRelationship(new Date(), follower, followed));
    this.userRepository.save(follower);
}

Предположим, у нас есть два пользователя в базе данных, user1 и user2. Если я следую за user2 с user1, то система правильно создает кортеж FollowRelationship внутри базы данных.

date:2020-02-28 14:38:39    from: user1 to: user2

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

Я видел вопрос ( Дубликаты в списке аннотированных OneToMany ), который, кажется, говорит об этой же проблеме, но я не конечно, потому что у меня другая реализация, у нее всего один список, у меня два в одном классе (FollowRelationship). И даже более того, я не уверен, почему он так себя ведет,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...