我有一个与@OneToMany相关的JPA问题,特别是涉及CascadeType.ALL功能。
我有两个实体,父级和子级。
以下是我目前的一个示例:
书
@Entity
@Table(name = "books")
public class Book implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@JoinColumn(name="id_page")
private List<Page> pages;
...
...
}
页面
@Entity
@Table(name = "pages")
public class Page implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "id_book")
private int idBook;
...
...
}
因此,我只有一本书和几页内容。当我保存这本书时,由于使用了CascadeType.ALL,也会保存其中包含的页面。
实际上,Hibernate尝试保存Book对象,并意识到有Page实体需要保存,然后通过级联ALL启动查询。
我只需执行以下操作:
bookRepository.save(book);
我想要保存的图书对应的JSON如下所示:
{
"id": 0,
"page": [
{
"id": 0,
"idBook": 0
}
]
}
然而,如果我将书的id设置为0,则会被创建。如果我在页面中将idBook设置为0,则会出现错误,如下所示:Key (id_book) = (0) is not present in table "book"。
但是,我真正不理解的是:为什么如果我在json中放置一个在数据库中存在的id_book,然后完成保存书实体后,它就能理解这个id并在数据库中正确插入它?
因此,如果我提供以下JSON。
{
"id": 0,
"page": [
{
"id": 0,
"idBook": 1
}
]
}
让我们考虑在数据库中只有一个id=1的书。 保存后,它会生成一行id=2的书,并且与该书链接的页面的id为2?
这件事让我疯狂。 如果给了一个idBook=0来告诉他要检索/生成它,他告诉我它不存在。另一方面,如果我给他一个确实存在但不正确的idBook,他会不予考虑并且会正确地使用刚刚创建的书的idBook吗?
我只想不用使用虚假的idBook,告诉他在创建书之后要获取页面的idBook,就像他现在所做的那样。
Page
并保存一个Book
? - Andronicus