Запрос REST API с использованием отношений Hibernate - PullRequest
0 голосов
/ 02 июля 2018

Контроллер покоя:

@PostMapping("transaction")
public ResponseEntity<Transaction> init(@RequestBody Transaction transactionInput) {
    Transaction transaction = transactionRepository.save(transactionInput);
    return new ResponseEntity<>(transaction, HttpStatus.OK);
}

Субъект транзакции:

@Getter
@Setter
@Entity
@NoArgsConstructor
@AllArgsConstructor
@DynamicInsert
@DynamicUpdate
@Table(name = "transaction")
public class Transaction {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = false)
    @JoinColumn(name="currency_id")
    private Currency currency;

Денежная единица:

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@DynamicInsert
@DynamicUpdate
@Table(name = "currency")
public class Currency {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Length(max = 3)
    private String sign;

    @Length(max = 30)
    private String name;

Запрос:

curl -X POST \
  http://localhost:4000/transaction-service/transaction \
  -H 'content-type: application/json' \
  -d '{
  "currency_id": 1
}'

И, очевидно, валюта равна нулю, и я получил эту ошибку:

не удалось выполнить оператор; SQL [н / п]; ограничение [currency_id]; вложенное исключение org.hibernate.exception.ConstraintViolationException: не удалось выполнить оператор

Есть ли способ автоматического сопоставления при отправке запроса с

"currency" = {"name" = "USD"}

Или как мне отправить этот запрос?

1 Ответ

0 голосов
/ 02 июля 2018

Вы не можете вставить Transaction до того, как Currency вставлено. То, как вы это делаете, кажется, вы пытаетесь вставить транзакцию с ее optional=false столбцом currency_id, установленным на null.

Если вы сначала сохраните сущность Currency, она должна работать. Я не уверен, есть ли какой-нибудь хороший способ сделать такую ​​«каскадную вставку».

Кроме того, это не очень хороший @OneToOne дизайн сущности - нет никаких ограничений, гарантирующих, что он действительно один к одному. CurrencyId должен быть первичным ключом или иметь какое-то уникальное ограничение, чтобы гарантировать, что он один к одному. В опубликованном вами фрагменте также нет очевидного значения класса Transaction.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...