我正在尝试在春季为电影和演员之间的关系建模。这里有我的两个课:
@Entity
public class Movie {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String genre;
private String year;
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private List<Actor> actors;
// getters and setters
@Entity
public class Actor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String surname;
private String age;
// getters and setters
我已经定义了一个多对多的单向关系,它可以正常工作,但在以下情况下则不能。如果我插入的新电影带有数据库中还没有的新演员,那么它将很好地工作,所有表都将正确更新。但是,如果要插入已保存的演员的新电影,则不想保存两次,我希望关系表引用已保存的演员,并且在“演员”表中未添加新的演员。
以下JSON是发送到端点以创建新电影的JSON:
{
"actors": [
{
"age": "string",
"dni": "string",
"name": "string",
"surname": "string"
}
],
"genre": "string",
"title": "string",
"year": "string"
}
那么如何在数据库中插入已经有演员的电影以进行引用?因为如果我插入一个具有完全相同数据的新角色,则会将该角色保存两次,并且在重复标识符的情况下,我会遇到唯一索引或主键冲突。
非常感谢您的帮助!
答案 0 :(得分:0)
如果双方都有对象标识符[@Id
],则可以使用session.saveOrUpdate
从Hibernate文档中:
saveOrUpdate()
执行以下操作:
- 如果对象已经存在 在此会话中,什么也不做
- 如果另一个对象与 会话具有相同的标识符,抛出 例外
- 如果对象没有 标识符属性
save()
- 如果对象的标识符具有值 分配给新实例化的 对象
save()
- 如果对象是 由
<version>
版本控制,或<timestamp>
,以及版本 属性值是相同的值 分配给新实例化的 对象save()
- 否则
update()
对象
答案 1 :(得分:0)
如果数据库中已有演员,则必须先获取演员,然后再将其添加到列表中。
@Autowired
ActorRepository actorRepository;
Optional<Actor> actorOptional = actorRepository.findById(id);
if(actorOptional.isPresent()){
movie.getActors().add(actorOptional.get());
}else{
// create new actor and add it to the list
}