Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate-多对多希望再次持久化数据_Java_Hibernate_Jpa_Many To Many_Persist - Fatal编程技术网

Java Hibernate-多对多希望再次持久化数据

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

我有一个User类,在这个类中,我需要对自身进行很多关系引用,尤其是我正在解决的用户可能会跟随/被跟随另一个用户的问题。不需要其他属性,因此它应该是一个具有复合主键的表。这就是它的注释方式:

@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