休眠-JPA-OneToMany和CascadeType.ALL

问题描述

我遇到@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;
    ...
    ...
}

PAGE

@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对象,并通过OneToMany意识到也有Page实体要保存,并借助Cascade ALL来启动查询。

我只是这样做:

bookRepository.save(book);

代表我要保存的书的json是这样的:

{
  "id": 0,"page": [
    {
      "id": 0,"idBook": 0
    }
  ]
}

但是,如果我在书号上输入0,则会创建它。如果我将idBook上的0放入页面中,则会出现如下错误:键(id_book)=(0)在表“ book”中不存在。

但是,我真正不明白的是:为什么如果我将一个id_book放入数据库中存在的json中,然后完成保存书实体,它会理解id是什么并将其正确插入数据库中?

因此,如果我提供此JSON。

{
  "id": 0,"idBook": 1
    }
  ]
}

让我们考虑一下,在数据库上只有一本ID = 1的书。 保存后,会为我生成一行ID = 2的书,以及一个链接到ID = 2的书的页面?

这件事使我发疯。 如果给idBook = 0告诉他必须检索/生成它,他告诉我它不存在。另一方面,如果我给他一个确实存在的idBook(但不正确),他是否甚至没有考虑并正确使用他刚创建的Book的idBook?

我只是不想使用虚假的idBook,告诉他创建图书后必须获取idBook页面,就像他实际上一样。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)