作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法从 Postman 中的 json 添加具有 SpringBoot 中现有类型的新书。它说“约束[\”PUBLIC.GENRE(GENRE_ID)上的主键”。
这是我的模型:
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="book_id")
private Integer Id;
private String title;
private String imgurl;
private String description;
private String bookpath;
@ManyToOne
private Author author;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "book_genre",
joinColumns = @JoinColumn(name="book_id"),
inverseJoinColumns = @JoinColumn(name="genre_id"))
private List<Genre> genres;
public void addGenre(Genre genre){
this.genres.add(genre);
genre.getBooks().add(this);
}
}
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Data
@Table(name = "genre")
public class Genre {
@Id
@Column(name="genre_id")
private Integer id;
private String name;
@JsonIgnore
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="book_genre",
joinColumns=@JoinColumn(name="genre_id"),
inverseJoinColumns=@JoinColumn(name="book_id"))
private List<Book> books;
public List<Book> getBooks(){
return this.books;
}
}
我正在使用 jpa 存储库。这是我的图书 Controller 发布方法:
@PostMapping("/books")
Book createBook(@RequestBody Book book){
return this.bookRepository.save(book);
}
在 postman 中我有这个:
{
"title": "Evgenij Onegin",
"imgurl": "https://biblioteka.msu.edu.mk/images/covers/2018/September/5bab75a75007c/821.806.jpeg",
"description": "desctiption",
"bookpath": "Books\\book1.pdf",
"author": {
"name": "Alexandar",
"surname": "Puskin",
"birthdate": "1799-06-05",
"description": "Russian author",
"location": "Russia",
"category": {
"name": "Romantism",
"id": 1
},
"id": 1
},
"genres": [
{
"id": 1,
"name": "Trailer"
},
{
"id": 2,
"name": "Comic"
}
]
}
我收到的错误:
constraint [\"PRIMARY KEY ON PUBLIC.GENRE(GENRE_ID)'.
看来问题出在ManyToMany关系中。如果不将流派添加到书中,它就可以完美工作,但我想添加它。
最佳答案
您的 ManyToMany
关联操作不正确。您正在两端定义 JoinTable
public class Book {
...
@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE } )
@JoinTable(name = "book_genre",
joinColumns = @JoinColumn(name = "book_id"),
inverseJoinColumns = @JoinColumn(name = "genre_id")
)
private List<Genre> genres;
...
}
在流派
的另一边,你只需这样做
public class Genre {
...
@ManyToMany(mappedBy = "genres")
private List<Book> books;
...
}
这是一篇关于 The best way to use the @ManyToMany annotation with JPA and Hibernate 的非常好的文章这将帮助您理解关联映射。
关于java - 如何在 JPA 中持久保存与其他实体具有多对多关联的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61145793/
我是一名优秀的程序员,十分优秀!