java - 父实体的主键未在子实体中存储为外键
问题描述
我在 Spring Data Jpa 中使用 OneToMany 关系并使用 postMan 测试 api
@Entity
@Table(name = "book_category")
public class BookCategory {
ParentEntity
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "bookCat_id")
private Long id;
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy="bookCategory")
private Set<Book> books;
public BookCategory(String name, Set<Book> books) {
this.name = name;
this.books = books;
}
// getter and setter
}
ChildEntity
@Entity
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "book_id")
private Long bookId;
private String name;
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "bookCat_id")
BookCategory bookCategory;
public Book() {
}
//getter and Setter
}
控制器类
@RestController
@RequestMapping(value = "/bookCategory")
public class BookController {
@Autowired
BookCategoryRepository bookCategoryRepository;
@Autowired
BookRepository bookRepository;
@PostMapping("/addBookCategory")
public BookCategory savePerson(@Valid @RequestBody BookCategory bookCategory){
return bookCategoryRepository.save(bookCategory);
}
}
从邮递员调用 Rest Api 并将 json 传递为
{
"name":"Category 1",
"books":[
{"name" : "Hello Koding 1"},
{"name":"Hello Koding 2"}
]
}
以下查询是由休眠执行的查询也是正确的,而我正在调用休息点 Hibernate:插入 book_category (name) values (?) Hibernate: insert into book (book_cat_id, name) values (?, ?)
它没有插入 book_cat_id,在 book_cat_id 中它传递了 null 所以 null 正在存储
数据库中存储的数据 book_category 数据库中的父表
book(ChildTable) book(ChildTable) I want to get Child Table Like 我想要这样的表
解决方案
问题是您没有在子对象中设置父对象。您应该在代码中的某处调用
public void setBookCategory(BookCategory bookCategory) { ... }
Book 实体的方法。
我建议通过在控制器中使用 DTO 并将它们映射到服务层中的实体来解决此问题,因为使用持久实体作为 http 请求的参数可能会导致严重的安全漏洞,如此处所述。
编辑:或者,即使我不鼓励这种解决方案,也可以像这样修改 savePerson 方法
@PostMapping("/addBookCategory")
public BookCategory savePerson(@Valid @RequestBody BookCategory bookCategory){
bookCategory.getBooks().forEach(book -> book.setBookCategory(bookCategory));
return bookCategoryRepository.save(bookCategory);
}
推荐阅读
- python - Python - ctypes.c_char.from_buffer 与 ctypes.c_void_p(string)
- sabre - Sabre 航班搜索 - BFM
- ios - 禁用捏合以在 QLPreviewController swift 中关闭手势
- java - 如何开始调试程序:在 GUI 上执行操作时知道哪些代码刚刚运行?
- python - 列表的maketrans替代品-python 2.7
- python - PYTHON - 为什么 Numpy 数组在通过索引间隔访问时不会引发超出边界的异常?
- c - `sysconf()` 和 `getrlimit()` 有什么关系和区别?
- wix - wix 工具集引导程序 msipackage 不正确检测状态
- r - 如何在 Bookdown 中更改为另一种参考书目样式
- php - 如何将命令行参数传递给 PHP 中的函数?