java - 使用 Hibernate 关系的 REST API 请求

标签 java hibernate rest spring-boot hibernate-mapping

休息 Controller :

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

显然货币为空,我收到此错误:

could not execute statement; SQL [n/a]; constraint [currency_id]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

有没有办法在我使用

发送请求时自动映射
"currency" = {"name" = "USD"}

或者我应该如何发送这个请求?

最佳答案

在插入货币之前,您无法插入交易。按照您的方式,您似乎正在尝试插入一个交易,其 optional=falsecurrency_id 设置为 null

如果您首先存储 Currency 实体,那么它应该可以工作。我不确定是否有什么好的方法来制作这样的“级联插入”的东西。

此外,这不是一个好的 @OneToOne 实体设计 - 没有任何约束来确保它确实是一对一的。 CurrencyId 应该是主键或者有一些唯一的约束以确保它是一对一的。从您发布的代码片段中也没有看到 Transaction 类的明显含义。

关于java - 使用 Hibernate 关系的 REST API 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51133745/

相关文章:

javascript - 使用 angularjs 获取休息服务

java - 如何修复 Android 中的 "Value &lt;!DOCTYPE of type java.lang.String cannot be converted to JSONObject"错误?

java - 命名空间错误 : An attempt is made to create or change an object in a way which is incorrect with regard to namespaces

java - 如何从 Play Framework 中的 YAML fixtures 加载(静态嵌套)枚举值?

java - Ajax、Java 和 Hibernate

java - 如何使用 Hibernate 保存或检索数组列

rest - 如何在 Heroku 上使用 JAX-RS 找出传入的 RESTful 请求的 IP?

http - Put 与 Post - REST

java - 反转带有前导零的数字

java - 如何在 Hibernate Criteria API 中添加 SQL-Server 查询提示