java - 如何在 JPA 中持久保存与其他实体具有多对多关联的实体?

标签 java spring hibernate spring-boot jpa

我无法从 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/

相关文章:

java - 如何使用 JPA/Hibernate 在两个相等的表之间复制多行?

java - 如何使用Java在Alfresco 5.0中获取对等关联节点?

Spring MVC 多部分响应

hibernate - 是否可以从单个线程抛出StaleStateObjectException?

java - 带有 Heroku 的 Firebase Admin SDK

java spring 连接到 mysql 数据库(不是 JNDI 池或系统数据源!)

java - 错误 : org. hibernate.exception.GenericJDBCException:无法提取 ResultSet

java - Tomcat 应用程序中的幽灵驱动程序

java - 如何在 Android 中连接到预配置的 Wifi?

java - ActionListener 和 ActionEvent 位于不同的类中