【发布时间】:2020-09-08 20:28:13
【问题描述】:
我是 Hibernate 的新手,我正在尝试解决类似于 this question 的问题,特别是 the answer。
我有一些非常相似的设置(在我的例子中是Author、Book 和映射表AuthorBook)。我在 Spring Data JPA 中使用它,所以我有以下组件:
- 存储库:
AuthorRepository、BookRepository、AuthorBookRepository - 服务:
AuthorService、BookService、AuthorBookRepository - 控制器:
AuthorController、BookController、AuthorBookController
我的实体是:
@Entity
public class Author {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "author")
private Set<AuthorBook> authorBooks;
// getters and setters
}
@Entity
public class Book {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "book")
private Set<AuthorBook> authorBooks;
// getters and setters
}
@Entity
public class AuthorBook {
@Id
@GeneratedValue
private Integer id;
@ManyToOne
@JoinColumn(name = "user_id")
private Author author;
@ManyToOne
@JoinColumn(name = "book_id")
private Book book;
@Column(name = "isMainAuthor")
private boolean isMainAuthor;
// getters and setter
}
我的理解是我应该发出以下 POST 请求:
创建作者:
{
"name": "Test Author"
}
创建一本书:
{
"name": "Test Book"
}
创建映射:
{
"author": {
"id": 1
},
"book": {
"id": 2
},
"isMainAuthor": true
}
首先:这是正确的使用方法吗?如果没有,我应该如何使用它?如果是,序列化应该如何工作?因为如果我这样做,然后获取书籍列表,响应将像这样无限长:
[
{
"id": 2,
"name": "Test Book",
"authorBooks": [
{
"id": 3,
"author": {
"id": 1,
"name": "Test Author",
"authorBooks": [
{
"id": 3,
"author": {
"id": 1,
"name": "Test Author",
"authorBooks": [
{
"id": 3,
"author": {
"id": 1,
"name": "Test Author",
"authorBooks": [
...
我知道我可以在Author 和AuthorBook 的Book getter 上使用@JsonIgnore,在setter 上使用@JsonProperty,这样反序列化仍然有效。但是,作为一个对 Hibernate 没有经验的人,这对我来说似乎是一个 hack。解决这个问题的最干净和最好的方法是什么?
另外,有没有办法直接通过作者和书籍端点更新映射?我可能已经在数据库中有一个作者,并且想通过添加一个新的Book 实体并提供关系作为其中的一部分来添加他写的新书,但我似乎无法做到这一点。
【问题讨论】:
标签: java spring-boot hibernate join spring-data-jpa