为了账号安全,请及时绑定邮箱和手机立即绑定

如何引用已经保存在数据库中的实例?

如何引用已经保存在数据库中的实例?

慕桂英3389331 2023-09-13 15:42:03
我试图在春天建立电影和演员之间的关系模型。这里有我的两门课:@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条经验 获得超5个赞

如果数据库中已有演员,则必须先获取它,然后将其添加到列表中。


 @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

 }


查看完整回答
反对 回复 2023-09-13
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

如果@Id两边都有对象标识符 [ ],则可以使用session.saveOrUpdate

来自 Hibernate 文档:

saveOrUpdate()执行以下操作:

  • 如果该对象已在此会话中持久化,则不执行任何操作

  • 如果与会话关联的另一个对象具有相同的标识符,则抛出异常

  • 如果对象没有标识符属性,save()

  • 如果对象的标识符具有分配给新实例化的对象的值,save()则它

  • 如果该对象由<version>或 进行版本控制<timestamp>,并且版本属性值与分配给新实例化的对象的值相同,save()

  • 否则 update()该对象


查看完整回答
反对 回复 2023-09-13
  • 2 回答
  • 0 关注
  • 50 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信