首页 > 解决方案 > JPA @MapsID 出现错误 org.hibernate.TransientPropertyValueException:对象引用了未保存的瞬态实例

问题描述

用户:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column
    private String name;

    @OneToOne(mappedBy = "user")
    private Address address;


    //Getters and setters
}

地址:

@Entity
public class Address {
    @Id
    private Long id;

    @Column
    private String country;

    @OneToOne
    @JoinColumn(name = "id")
    @MapsId
    private User user;


    //Getters and setters
}

以下是我得到的错误:

2020-05-02 02:33:42 - Uncaught Runtime Exception
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance

用户和地址类都共享相同的主键..

你能告诉我在上面的代码中我还需要改变什么吗?我在上面写了一些我发现的例子,如果有人能解释我内部发生的事情,我会很高兴

编辑:

我正在尝试插入具有如下 RequestBody 的用户,然后面对上述异常。

{
    "name": "john",
    "adddress": {
        "country": "US"
    }
}

标签: hibernatespring-mvcjpaspring-data-jpa

解决方案


您需要级联关系。在User实体中,将关系更改为:

@OneToOne(mappedBy = "user", cascade = CascadeType.ALL)

这会将任何操作从父实体传播到子实体,即从User这里传播Address。因此,当您持久化一个User对象时,关联的Address对象也将被持久化,依此类推。


延伸阅读:


推荐阅读