【问题标题】:How do I insert data in a @JoinColumn column in Spring Boot?如何在 Spring Boot 的 @JoinColumn 列中插入数据?
【发布时间】:2021-01-19 01:53:31
【问题描述】:

当我通过 POST 请求将数据传递给我的 TodoItem 模型时,只有@column 指定的列被填写,但@JoinColumn 列是null,即使我在 JSON 中使用列名送过来。不过,我的 GET 请求 API 工作得很好,所以我从控制器代码中省略了它们。

TodoItem.java

@Entity
@Table(name = "todo_item")
public class TodoItem {

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

@Column(name = "todo")
private String todo;

@Column(name = "completed")
private boolean completed;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;

public TodoItem() {
}

public TodoItem(String todo, boolean completed) {
    this.todo = todo;
    this.completed = completed;
}

// setters and getters
}

我的构造函数没有提到user_id,虽然不认为它需要它,但我可能错了。

TodoController.java

@RestController
@RequestMapping("/api")
public class TodoController {

@Autowired
private UserRepository userRepository;

@Autowired
private TodoRepository todoRepository;

@PostMapping("/addItem")
public TodoItem addTodoItem(@RequestBody TodoItem todoItem) {
    return this.todoRepository.save(todoItem);
}
}

我将POST 发送给http://localhost:8080/api/addItem

请求:

{
  "todo": "finish portfolio",
  "completed": false,
  "user_id": 1
}

但是在我的 MySQL 工作台中,todocompleted 被正确填充,但 user_id 表示 null

【问题讨论】:

    标签: java mysql spring spring-boot api


    【解决方案1】:

    在 spring 数据中(使用 hibernate 或 JPA),当保存引用另一个实体的实体时。您必须首先通过 id 获取引用的对象,然后在持久性实体中使用 setter 设置它。之后,您可以保存并获取(FK列)进行保存。

    例如,您首先必须使用用户存储库并调用

    User user = userRepository.findById(userId);
    

    然后

    todoItem.setUser(user);
    

    之后您可以保存项目,FK 列将被填充。

    我认为这是保存引用实体的方式。您不能仅在 int id 上中继。

    您的请求正文 JSON 也必须是这样的:

    {
       "todo": "finish portfolio",
       "completed": false,
       "user": {
          "user_id":1
        }
    

    }

    也是定义和使用 DTO 对象而不是实体本身的最佳实践。

    【讨论】:

    • 我其实只是 JSON 格式错了,是你写的方式,但是“id”而不是“user_id”
    • 很好,至少你解决了你的问题,你可以继续前进。请接受它作为经过验证的答案,以便其他开发人员可以从中受益。
    • 这并不完全正确,但它引导我找到了正确的解决方案
    • 它会引导你正确答案,所以它可以帮助像你一样的其他人。
    猜你喜欢
    • 2021-08-01
    • 2022-01-17
    • 2019-08-08
    • 2021-02-25
    • 2018-07-10
    • 2021-07-31
    • 1970-01-01
    • 2019-12-14
    • 2018-03-25
    相关资源
    最近更新 更多