hibernate - 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"
}
}
解决方案
您需要级联关系。在User
实体中,将关系更改为:
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
这会将任何操作从父实体传播到子实体,即从User
这里传播Address
。因此,当您持久化一个User
对象时,关联的Address
对象也将被持久化,依此类推。
延伸阅读:
CascadeType
在 javadoc 中Hibernate 用户指南中的级联实体状态转换
推荐阅读
- javascript - 如何从json中提取数据并将其注入图表?
- c++ - 如何使用aidl-cpp生成.aidl to c++代码
- python-3.x - 使用 Open CV 在 Python 中创建正图像
- python - Django 多对多字段使用唯一键而不是主键
- tvos - 如何检测用户何时在 tvOS (tvml/tvjs) 应用程序中进入和退出 Airplay
- sql - 如何在 IntelliJ 中设置 sql 方言
- vba - 循环遍历不同工作表中的范围(Excel)
- spring-boot - 在 1 个 Spring Boot 应用程序中运行 2 个容器
- concrete5 - 具体5 域变化
- node.js - Cloud Functions 查询数据库