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)
我发送POST至http://localhost:8080/api/addItem
要求:
{
"todo": "finish portfolio",
"completed": false,
"user_id": 1
}
Run Code Online (Sandbox Code Playgroud)
然而在我的 MySQL 工作台中,todo并completed正确填充但user_id说null
小智 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 对象而不是实体本身的最佳实践也是如此。
| 归档时间: |
|
| 查看次数: |
4192 次 |
| 最近记录: |