hibernate - 通过带有 JoinColumn 的 REST 持续存在的问题(Spring Boot/Hibernate)
问题描述
我对抽象数据建模的概念相当熟悉,所以我尝试使用 Spring Boot 制作一个 API,包括使用 Hibernate/Javax 持久性的 String Boot Starter Data JPA。
我想要做的是能够通过 REST 发布请求(使用 Postman 进行测试)。我有这个适用于普通 POJO,但是我有一个 JoinColumn,它都有点梨形。
例如,我有以下内容:
@Entity
@Table( name = "customer_tbl" )
public class Customer
{
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private long customerId;
@Column( name = "customer_name", nullable = false, unique = true )
private String customerName;
......作为父母,有点像,带着下面的孩子......
@Entity
@Table( name = "scheme_tbl" )
public class Scheme
{
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private long schemeId;
@ManyToOne( fetch = FetchType.LAZY, optional = false )
@PrimaryKeyJoinColumn( name = "customer_id" )
@OnDelete( action = OnDeleteAction.CASCADE )
@JsonProperty( "customer" )
@NotNull
private Customer customer;
@Column( name = "scheme_name", nullable = false, unique = true )
private String schemeName;
这个想法是,对于每个customer
,可能有许多scheme
条目。
我想通过 REST 发布一个对象,并引用该对象所属scheme
的父级,就像这样customer
scheme
{
"customer": {
"customer_id" : "1",
"customerName" : "TestCustomer"
},
"schemeName": "TestScheme"
}
(我已经尝试了很多变种customer
)
我已经尝试了各种方法,customer
直到null
我@RequestBody
添加了@JsonProperty
. 这被认为@RequestBody
是一个完整的customer
对象,但它真的不喜欢它并且有一个unsaved transient entity
例外。现在的问题是,它仍然没有达到我希望达到的效果——通过传入一个客户参考,从而customer_id
正确设置列(或通过 fk/lookup 建立的关联)。
这对 REST 可行吗?我在类方法中进行了类似的工作,只需${customerId}
使用 Thymeleaf 设置表单,它也返回一个scheme
对象并愉快地持续存在
解决方案
设法弄清楚这一点。
该问题是由对象customer
中的变量Scheme
和(我假设)Customer
对象之间的歧义引起的。
尽管 POJO 包含一个对象,而不是一个变量,但当我将 Scheme POJO 中的对象变量重构为 时customerId
,一切都开始工作了。在这个阶段将对象称为 ID 感觉不自然,但它确实有效。
Scheme
POJO 现在具有以下变量:
@ManyToOne( fetch = FetchType.LAZY, optional = false )
@JoinColumn( name = "customer_id", nullable = false )
@OnDelete( action = OnDeleteAction.CASCADE )
private Customer customerId;
插入是通过发布完成的......
{
"customerId": { "customerId": "1"},
"schemeName": "TestScheme"
}
我能够通过在持久性之前查找Customer
viacustomerId
并将其设置回对象来在 API 中设置客户。Scheme
推荐阅读
- mongodb - MongoDB:具有动态键的地理空间嵌入式文档
- python - 如何在 django 中更新文本区域的内容
- java-websocket - 在运行时在 jsr websocket ServerEndPoint 中添加/删除编码器
- python - 根据熊猫中的前后行计算一行中的值
- c# - 如何有效地获取当前的 Windows 用户帐户名?
- visual-studio - 从 Visual Studio 2019 中选择或更改 APK V1 签名方案
- javascript - 如何使用 JS/JQ/ 从 Marquee 获取值以显示在标签中
- java - 保持文件夹结构完整 Zip 任务 (Ant)
- javascript - 从 txt 或 json 文件向 js 脚本添加值
- c# - ASP.NET Core 3.1“无法从根提供程序解析范围服务。”