Проблема сохраняется через REST с JoinColumn (Spring Boot / Hibernate) - PullRequest
0 голосов
/ 04 мая 2019

Я достаточно зеленый с концепцией абстрактного моделирования данных, поэтому я пытаюсь создать API с использованием Spring Boot, включая String Boot Starter Data JPA, который использует Hibernate / Javax персистентность.

То, что я пытаюсь сделать, - это возможность отправлять запросы через REST (используя Почтальон для тестирования). У меня это работает для обычных 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 записей.

Я хотел бы опубликовать scheme объект через REST со ссылкой на родительский элемент 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 и счастливо сохраняется

1 Ответ

0 голосов
/ 04 мая 2019

Удалось это выяснить.

Проблема была вызвана неоднозначностью между customer, переменной в Scheme объекте и (я предполагаю) Customer объектом.

Несмотря на то, что POJO содержит объект, а не переменную, когда я реорганизовал переменную объекта в схеме POJO в customerId, все это начало работать. На данном этапе кажется неестественным называть объект идентификатором, но это работает.

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"
}

Мне удалось настроить клиента в API, просмотрев Customer через customerId и установив его обратно в объект Scheme до сохранения.

...