【问题标题】:How to refer to an instance already saved in database?如何引用已经保存在数据库中的实例?
【发布时间】:2020-01-29 21:38:42
【问题描述】:

我试图在春季模拟电影和演员之间的关系。这里有我的两个类:

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

那么我如何插入一个演员已经在数据库中的电影以便引用它呢?因为如果我插入一个具有完全相同数据的新演员,我会两次保存这个演员,并且在标识符重复的情况下,我会得到唯一索引或主键违规。

非常感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    如果你在数据库中有一个现有的actor,你必须先获取它,然后将它添加到列表中。

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

    【讨论】:

      【解决方案2】:

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

      来自 Hibernate 文档:

      saveOrUpdate() 执行以下操作:

      • 如果对象已经是持久的 在此会话中,什么都不做
      • 如果另一个对象与 会话具有相同的标识符,抛出 例外
      • 如果对象没有 标识符属性,save()it
      • 如果对象的标识符有值 分配给新实例化的 对象,save()
      • 如果对象是 由&lt;version&gt;&lt;timestamp&gt;,以及版本 属性值是相同的值 分配给新实例化的 对象,save()
      • 否则 update()对象

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 2019-12-25
        • 1970-01-01
        • 1970-01-01
        • 2012-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多