如何在 Spring Boot 中的 @JoinColumn 列中插入数据?

Jak*_*han 0 java mysql api spring spring-boot

@column当我通过 POST 请求将数据传递到 TodoItem 模型时,仅填充由 指定的列,但即使我使用要发送的 JSON 中的列名称,该@JoinColumn列也是如此。null然而,我的 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
}
Run Code Online (Sandbox Code Playgroud)

我的构造函数没有提到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);
}
}
Run Code Online (Sandbox Code Playgroud)

我发送POSThttp://localhost:8080/api/addItem

要求:

{
  "todo": "finish portfolio",
  "completed": false,
  "user_id": 1
}
Run Code Online (Sandbox Code Playgroud)

然而在我的 MySQL 工作台中,todocompleted正确填充但user_idnull

小智 5

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

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

User user = userRepository.findById(userId);
Run Code Online (Sandbox Code Playgroud)

进而

todoItem.setUser(user);
Run Code Online (Sandbox Code Playgroud)

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

我认为这是保存参考实体的方法。您不能仅中继 int id。

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

{
   "todo": "finish portfolio",
   "completed": false,
   "user": {
      "user_id":1
    }
Run Code Online (Sandbox Code Playgroud)

}

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