Java 无法执行SQL语句

Java 无法执行SQL语句,java,sql,jpa,Java,Sql,Jpa,在编写应用程序时,我遇到了执行SQL语句的问题。我试着在网上寻找解决方案,但没有一个结果有用,我仍然不知道如何处理我遇到的错误。以下是我得到的例外: org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["FKAM8LLDERP40MVBBWCEQPU6L2S: PUBLIC.BOOK_CATEGORY FOREIGN KEY(CAT

在编写应用程序时,我遇到了执行SQL语句的问题。我试着在网上寻找解决方案,但没有一个结果有用,我仍然不知道如何处理我遇到的错误。以下是我得到的例外:

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["FKAM8LLDERP40MVBBWCEQPU6L2S: PUBLIC.BOOK_CATEGORY FOREIGN KEY(CATEGORY_ID) REFERENCES PUBLIC.CATEGORY(ID) (2)"; SQL statement:
insert into book_category (book_id, category_id) values (?, ?) [23506-196]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
这就是这些类的外观: 图书班

@实体
@表(name=“book”)
公共课堂用书{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(nullable=false)
私有字符串标题;
私有字符串描述;
@列(name=“发布日期”)
@时态(TemporalType.TIMESTAMP)
私人日期发布日期;
@JoinColumn(name=“封面图片”)
@OneTONE(cascade=CascadeType.MERGE)
私有上传文件coverImage;
@OneTONE(cascade=CascadeType.MERGE)
私有上传文件内容;
@许多
@JoinTable(name=“book\u category”,joinColumns={@JoinColumn(name=“book\u id”,referencedColumnName=“id”)},
inverseJoinColumns={@JoinColumn(name=“category\u id”,referencedColumnName=“id”)}
私有集合类别;
//构造函数、setter、getter
}
类别

@实体
@表(name=“category”)
公共类类别{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(name=“category\u name”)
私有字符串名称;
@ManyToMany(mappedBy=“categories”,fetch=FetchType.LAZY)
私人书目;
// ...
}

那里缺少
级联定义。

在首先插入引用的实体(书籍或类别)之前,将写入书籍类别。由于您指定的约束,这是不允许的。解决方案是定义

cascade = CascadeType.ALL

在连接的两侧(在书籍和类别中)。这将确保JPA以正确的顺序保存所有实体。

您是否读取了错误?它告诉您违反了名为
FKAM8LLDERP40MVBBWCEQPU6L2S
的约束。它还告诉您该约束是如何工作的,以便您可以识别查询中的错误。
@Entity
@Table(name = "category")
public class Category {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "category_name")
    private String name;
    @ManyToMany(mappedBy = "categories", fetch = FetchType.LAZY)
    private List<Book> books;

    // ...
}
cascade = CascadeType.ALL