@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。因此,要将其转换为实体,我正在使用 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即可更新其中的书。
答案 0 :(得分:0)
使用 CascadeType.MERGE
或者您是否可以尝试使用 saveOrUpdate()或 merge()休眠方法。
或在链接下方结帐(已询问)