Java Hibernate-多对多希望再次持久化数据
我有一个User类,在这个类中,我需要对自身进行很多关系引用,尤其是我正在解决的用户可能会跟随/被跟随另一个用户的问题。不需要其他属性,因此它应该是一个具有复合主键的表。这就是它的注释方式:Java Hibernate-多对多希望再次持久化数据,java,hibernate,jpa,many-to-many,persist,Java,Hibernate,Jpa,Many To Many,Persist,我有一个User类,在这个类中,我需要对自身进行很多关系引用,尤其是我正在解决的用户可能会跟随/被跟随另一个用户的问题。不需要其他属性,因此它应该是一个具有复合主键的表。这就是它的注释方式: @ManyToMany(cascade = {CascadeType.ALL, CascadeType.MERGE}) @JoinTable(name = "user_followers", joinColumns = { @JoinColumn(name = "follower") }, inverseJ
@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>();
这就是我添加关注者和持久用户的方式:
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似乎没有看到以前的关系被保存并写入数据库,并且仍然尝试插入新的记录,当然这些记录落在重复的键上。你知道我做错了什么吗?可能与此无关,但是“if(session.contains(user)->persist”是错误的,如果会话已经包含对象,则对象已附加,因此不需要对其调用persist(只要更改对象,一旦调用commit,就会刷新更改).BTW,你说的第一次和第二次是什么意思?不同的事务?相同的事务?它意味着不同的事务,它被HTTP请求分割(我使用Wicket)。第一次执行并关闭,第二次随后执行。
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