Java 使用现有值休眠多对多映射

Java 使用现有值休眠多对多映射,java,hibernate,many-to-many,Java,Hibernate,Many To Many,使用JPA2和Hibernate 我有两个类在源数据中是相互关联的 人员类别: @Entity public class Person { @Id @Column("PERSON_ID") @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String name; private String job; // getters & setters

使用JPA2和Hibernate

我有两个类在源数据中是相互关联的

人员类别:

@Entity
public class Person {
    @Id @Column("PERSON_ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String name;
    private String job;
    // getters & setters
}
还有电影课:

@Entity
public class Movie {
    @Id @Column("MOVIE_ID")
    private long id;
    private String movieName;
    private String rating;
    @ManyToMany
    @JoinTable(name = "Movie_Actor",
      joinColumns = @JoinColumn(name="Movie_ID"),
      inverseJoinColumns = @JoinColumn(name="Person_ID")
    )
    private Set<Person> actors = new HashSet<Person>();
    // getters & setters
}
我目前有代码可以将人物(演员)和电影对象插入数据库(只要它们当前不存在)

我想做的是在用其他地方的数据(例如引号/图片)丰富对象后更新
Person
对象,将其保存到数据库
session.save(actor)
(它创建
Person\u ID
,然后保存
电影
对象

问题是,当我用更新的
(包括ID)更新
电影
对象时,我在数据库上得到一个唯一的约束错误(因为
已经存在)

如何将
电影
对象与这些预先创建的
人物
对象保存在一起,这些对象可能有关系,也可能没有关系



编辑:根据Thomas的建议,我已将session.save更改为session.saveOrUpdate,这解决了唯一的常量问题。

仅总结一下我猜您在做什么以及为什么
saveOrUpdate
修复了该问题:

save
将在数据库中创建该实体的新实例,并可能将已存在的id视为已授予。此方法仅用于创建实体,不用于更新

另一方面,
saveOrUpdate
将首先检查您传递的实体是否已经存在,如果已经存在,将进行更新。如果不存在,将创建一个新的数据集


因此,使用
save
进行更新将导致两个数据集具有相同的id,从而导致唯一密钥约束冲突。

您如何将人员添加到
actors
?您是否可以显示一些代码?当然,我已经编辑了文章以包含该片段。只使用了一个简单的添加方法。您是否也可以为
Ac发布保存代码tor
电影
?是否使用
保存
进行更新?如果是,这可能是错误,请尝试
保存或更新
。更改为保存或更新似乎解决了此特定问题。
Person actor = new Person();
actor.setId=0;
actor.setName="Actor Name";
actor.setJob="Actor";
movie.addActor(actor);

From Movie.java
public void addActor(Person actor) {
    actors.add(actor);
}