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

我试图在春天建立电影和演员之间的关系模型。这里有我的两门课:


@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"

}

那么如何插入数据库中已有演员的电影以便被引用呢?因为如果我插入一个具有完全相同数据的新数据,我会将该参与者保存两次,并且在标识符重复的情况下,我会遇到唯一索引或主键冲突。


非常感谢你的帮助!


慕桂英3389331
浏览 52回答 2
2回答

梦里花落0921

如果数据库中已有演员,则必须先获取它,然后将其添加到列表中。&nbsp;@Autowired&nbsp;ActorRepository actorRepository;&nbsp;Optional<Actor> actorOptional = actorRepository.findById(id);&nbsp;if(actorOptional.isPresent()){&nbsp; &nbsp; &nbsp;movie.getActors().add(actorOptional.get());&nbsp;}else{&nbsp; &nbsp;// create new actor and add it to the list&nbsp;}

一只甜甜圈

如果@Id两边都有对象标识符 [ ],则可以使用session.saveOrUpdate来自 Hibernate 文档:saveOrUpdate()执行以下操作:如果该对象已在此会话中持久化,则不执行任何操作如果与会话关联的另一个对象具有相同的标识符,则抛出异常如果对象没有标识符属性,save()则如果对象的标识符具有分配给新实例化的对象的值,save()则它如果该对象由<version>或 进行版本控制<timestamp>,并且版本属性值与分配给新实例化的对象的值相同,save()则否则&nbsp;update()该对象
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java