【问题标题】:Why is hibernate trying to find an entity in the database instead of creating it? [closed]为什么hibernate试图在数据库中找到一个实体而不是创建它? [关闭]
【发布时间】:2021-04-04 03:22:53
【问题描述】:

我有两个实体。

@Entity
public class Parent {
    @Id
    private UUID id;
    
    private String someValue;
    
    @OneToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "child_id", referencedColumnName = "id")
    private Child child;
}

@Entity
public class Child {
    @Id
    @GeneratedValue
    private UUID id;
    
    private String someVariable;
    
    private Integer someValue;
}

并且实体持久化逻辑非常简单:

@Override
public ParentDto create(ParentDto parentDto) {
    if (repository.existsById(parentDto.getId())){
        throw new ParentWithIdAlreadyExistsException(parentDto.getId());
    }
    return mapper.toDto(repository.save(mapper.toDomain(parentDto)));
}

但是当我尝试持久化父实体时 - 休眠抛出异常

嵌套异常是 org.springframework.orm.jpa.JpaObjectRetrievalFailureException:无法 找到带有 id 的 .child 6d387565-0e7c-4b0d-85ba-c21cdbb39871;嵌套异常是 javax.persistence.EntityNotFoundException:无法找到 .ID 为 6d387565-0e7c-4b0d-85ba-c21cdbb39871 的孩子] 根本原因

为什么 hibernate 试图在数据库中查找子实体而不是创建它?

【问题讨论】:

  • 我们可以得出Parent.id应该等于Child.id的结论。那么,你为什么用@GeneratedValue 代替Child?我想它应该被删除。请说明您如何持久化实体。
  • 我更新了我的问题。往上看
  • 请同时显示mapper.toDomain方法。

标签: java spring-boot hibernate spring-mvc spring-data-jpa


【解决方案1】:

您的班级名称中有错字。类名不能以brackets () 开头。

【讨论】:

    猜你喜欢
    • 2017-03-27
    • 2014-04-16
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多