Hibernate - Many To Many снова хочет сохранить данные - PullRequest
0 голосов
/ 23 июня 2018

У меня есть класс User, где я хочу, чтобы отношение ManyToMany ссылалось на самого себя - Particalury Я решаю, что пользователь может следовать / следовать за другим пользователем. Другие атрибуты не нужны, поэтому это должна быть одна таблица с составным первичным ключом. Вот как это комментируется:

@ManyToMany(cascade = {CascadeType.ALL, CascadeType.MERGE})
@JoinTable(name = "user_followers", joinColumns = { @JoinColumn(name = "follower") }, inverseJoinColumns = { @JoinColumn(name = "following") })
private Set<User> following = new HashSet<User>();

@ManyToMany(mappedBy = "following")
private Set<User> followers = new HashSet<User>();

Все выглядит хорошо - таблица сгенерирована, PK составная follower_following . Когда я сохраняю данные с первой попытки, это работает - оператор вставки выполняется. НО во второй раз он все еще пытается вставить ранее выполненное отношение (очевидно, не то же самое отношение), и я получаю:

Unexpected RuntimeException
Last cause: Duplicate entry 'follower-following' for key 'PRIMARY' 
// EDIT: There are correct FK keys instead of follower-following

Вот как я добавляю подписчика и сохраняю пользователя:

if (!user.following.contains(toFollowUser)) {
   user.following.add(toFollowUser);
}

if (session.contains(user)) {
    session.persist(user);
} else {
    session.merge(user)
}
session.getTransaction().commit(); // HERE I get exception

С моей точки зрения, похоже, что Hibernate не видит, что предыдущее отношение было сохранено и записано в базу данных, и все еще пытается вставить новую запись, которая, конечно, попадает на дублированный ключ. У вас есть идея, что я делаю не так?

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