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

Java 如何在Spring Boot中的@JoinColumn列中插入数据?,java,mysql,spring,spring-boot,api,Java,Mysql,Spring,Spring Boot,Api,当我通过POST请求将数据传递到我的TodoItem模型时,只有@column指定的列被填充,但是@JoinColumn列是null,即使我在发送的JSON中使用了列名。然而,我的GET请求API工作得很好,所以我从控制器代码中省略了它们 TodoItem.java @Entity @Table(name = "todo_item") public class TodoItem { @Id @GeneratedValue(strategy = GenerationType.

当我通过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
}
@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);
}
}
我的构造函数没有提到
用户id
,虽然我认为它不需要它,但我可能错了

TodoController.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
}
@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工作台中,
todo
completed
正确填充,但是
user\u id
在spring数据中表示
null

(使用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格式化错误,这是您编写JSON的方式,但“id”而不是“用户id”很好,至少解决了您的问题,您可以继续。请接受这个经过验证的答案,这样其他开发人员就可以从中受益。这并不完全正确,但它会引导我找到正确的解决方案。它会引导你找到正确的答案,从而帮助其他人,就像你一样。