休息控制器:
@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=false
列currency_id
设置为null
的事务。
如果先存储Currency
实体,则它应该可以工作。我不确定是否有任何好的方法可以制作这样的“级联插件”。
同样,这不是一个好的@OneToOne
实体设计-没有约束确保它真正一对一。 CurrencyId应该是主键,或者具有一些唯一约束以确保它是一对一的。您发布的代码段中也没有明显的Transaction类含义。