休眠版本-由以下原因导致:org.hibernate.PersistentObjectException:传递给持久对象的分离实体:

时间:2018-09-27 11:26:22

标签: java hibernate jpa

@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.ALLorphanRemoval = true

这是保存的地方

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

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

在我发送请求正文之后,它就是dto。因此,要将其转换为实体,我正在使用 fromDTO

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

所以我删除了ID行,现在可以使用了:

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

我不知道为什么,但是现在可以了。

它使用fromdto进行更新和创建,因此对于创建来说,无需为实体设置id,因为它将创建新的。对于修改,也许我将来可能需要,但就目前而言,我不需要ID。因为我提供了商店的ID,所以它不需要其中的bookid即可更新其中的书。

1 个答案:

答案 0 :(得分:0)

使用 CascadeType.MERGE

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

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

JPA/Hibernate: detached entity passed to persist