首页 > 解决方案 > 通过带有 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的父级,就像这样customerscheme

{
"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对象并愉快地持续存在

标签: hibernatespring-bootjavax.persistence

解决方案


设法弄清楚这一点。

该问题是由对象customer中的变量Scheme和(我假设)Customer对象之间的歧义引起的。

尽管 POJO 包含一个对象,而不是一个变量,但当我将 Scheme POJO 中的对象变量重构为 时customerId,一切都开始工作了。在这个阶段将对象称为 ID 感觉不自然,但它确实有效。

SchemePOJO 现在具有以下变量:

@ManyToOne( fetch = FetchType.LAZY, optional = false )
@JoinColumn( name = "customer_id", nullable = false )
@OnDelete( action = OnDeleteAction.CASCADE )
private Customer customerId;

插入是通过发布完成的......

{
"customerId": { "customerId": "1"},
"schemeName": "TestScheme"
}

我能够通过在持久性之前查找CustomerviacustomerId并将其设置回对象来在 API 中设置客户。Scheme


推荐阅读