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

时间:2019-09-30 14:58:48

标签: java database spring spring-data-jpa h2

我正在尝试在春季为电影和演员之间的关系建模。这里有我的两个课:

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

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

非常感谢您的帮助!

2 个答案:

答案 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
 }