我试图在春天建立电影和演员之间的关系模型。这里有我的两门课:@Entitypublic 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@Entitypublic 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"}那么如何插入数据库中已有演员的电影以便被引用呢?因为如果我插入一个具有完全相同数据的新数据,我会将该参与者保存两次,并且在标识符重复的情况下,我会遇到唯一索引或主键冲突。非常感谢你的帮助!
2 回答
梦里花落0921
TA贡献1772条经验 获得超6个赞
如果数据库中已有演员,则必须先获取它,然后将其添加到列表中。
@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
}
一只甜甜圈
TA贡献1836条经验 获得超5个赞
如果@Id
两边都有对象标识符 [ ],则可以使用session.saveOrUpdate
来自 Hibernate 文档:
saveOrUpdate()
执行以下操作:
如果该对象已在此会话中持久化,则不执行任何操作
如果与会话关联的另一个对象具有相同的标识符,则抛出异常
如果对象没有标识符属性,
save()
则如果对象的标识符具有分配给新实例化的对象的值,
save()
则它如果该对象由
<version>
或 进行版本控制<timestamp>
,并且版本属性值与分配给新实例化的对象的值相同,save()
则否则
update()
该对象
添加回答
举报
0/150
提交
取消