通过JoinColumn(Spring Boot / Hibernate)通过REST持续存在的问题

时间:2019-05-03 21:28:22

标签: hibernate spring-boot javax.persistence

我对抽象数据建模的概念相当满意,因此我尝试使用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建立的关联)。 / p>

REST有可能吗?我在类方法中也有类似的工作,只需使用Thymeleaf设置表单中的${customerId}即可,它还会返回一个scheme对象并很高兴地保持

1 个答案:

答案 0 :(得分:0)

设法弄清楚了。

该问题是由customerScheme对象中的变量和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查找customerId,然后在持久化之前将其设置回Scheme对象,从而在API中设置客户。