我对抽象数据建模的概念相当满意,因此我尝试使用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
对象并很高兴地保持
答案 0 :(得分:0)
设法弄清楚了。
该问题是由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
查找customerId
,然后在持久化之前将其设置回Scheme
对象,从而在API中设置客户。