首页 > 解决方案 > Hibernate 版本 - 引起:org.hibernate.PersistentObjectException:分离的实体传递给坚持:

问题描述

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Book book;

这是在商店课上。

在书对象中,有version, id, name

我在创建请求中发送商店对象。

如果我发送

  "book": {
      "description": "string",
      "documentId": 0,
      "filterName": "string",
      "id": 0,
      "isBook": true,
      "version": 0
    },

这给出了错误:

caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: rally.services.center.domain.book.book

如果我删除版本并发送这个

  "book": {
      "description": "string",
      "documentId": 0,
      "filterName": "string",
      "id": 0,
      "isBook": true

没有错误。

为什么会这样?},

当商店被删除时,书应该被删除并且更新也是CascadeType.ALL如此orphanRemoval = true

这是它正在保存的地方

 Book book = new Book(request.getBook());
    Book savedBook = bookRepository.save(book);

它在最后一行给出错误。我没有覆盖保存方法。

在我发送该请求正文后,它是 dto。因此,要将其转换为实体,我使用的是来自 DTO 的

   setDocumentId(bookDTO.getDocumentId());
    setDescription(bookDTO.getDescription());
    setId(bookDTO.getId());
    setVersion(bookDTO.getVersion());

所以我删除了 id 行,现在它可以工作了:

   setDocumentId(bookDTO.getDocumentId());
    setDescription(bookDTO.getDescription());
    setVersion(bookDTO.getVersion());

我不知道为什么,但现在它可以工作了。

它使用 fromdto 进行更新并使用 create so 进行创建,无需为实体设置 id,因为它会创建新的。对于修改,也许我将来可能需要,但现在,我不需要 id。因为我给了商店的 id,所以它会更新里面的书,而不需要 bookid。

标签: javahibernatejpa

解决方案


使用CascadeType.MERGE

或者您可以尝试使用休眠的saveOrUpdate()merge()方法。

或在链接下方结帐(已询问)

JPA/Hibernate:分离的实体传递给持久化


推荐阅读