java—如何在SpringBoot中在@joincolumn列中插入数据?

wnavrhmk  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(368)

当我通过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);
}
}

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

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

但是在我的mysql工作台上, todo 以及 completed 适当填充,但是 user_idnull

s4n0splo

s4n0splo1#

在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对象而不是实体本身也是最佳实践。

相关问题