休息控制器:

@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
}'


而且显然货币为null,我得到了这个错误:


  无法执行语句; SQL [n / a];约束[currency_id];
  嵌套异常为
  org.hibernate.exception.ConstraintViolationException:无法
  执行语句


当我发送请求时,有没有一种自动映射的方法

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


还是应该发送此请求?

最佳答案

不能在插入Transaction之前插入Currency。这样做的方式似乎是在尝试插入optional=falsecurrency_id设置为null的事务。

如果先存储Currency实体,则它应该可以工作。我不确定是否有任何好的方法可以制作这样的“级联插件”。

同样,这不是一个好的@OneToOne实体设计-没有约束确保它真正一对一。 CurrencyId应该是主键,或者具有一些唯一约束以确保它是一对一的。您发布的代码段中也没有明显的Transaction类含义。

09-26 08:10