У меня есть класс 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 не видит, что предыдущее отношение было сохранено и записано в базу данных, и все еще пытается вставить новую запись, которая, конечно, попадает на дублированный ключ. У вас есть идея, что я делаю не так?