Fala galera!
eu tenho a seguinte configuração:
ProductPriceEntity
@Entity
@Table(name = "PRODUCTPRICE")
public class ProductPriceEntity {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SUPERMARKET_STORE_ID", nullable = false)
private SupermarketStoreEntity store;
...
}
ProductPriceNewRequest (é um DTO)
@Setter @Getter
public class ProductPriceNewRequest {
...
private Long storeId;
...
}
ProductPriceControllerImpl
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public ResponseEntity<ProductPriceResponse> save(@PathVariable(value = "product_id", required = true) Long productId, @RequestBody @Valid ProductPriceNewRequest productPriceNewRequest) {
ProductEntity productEntity = productService.findById(productId);
ProductPriceEntity productPriceEntity = modelMapper.map(productPriceNewRequest, ProductPriceEntity.class);
productPriceEntity.setProduct(productEntity);
productPriceEntity = service.insert(productPriceEntity);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(productPriceEntity.getId())
.toUri();
ProductPriceResponse productPriceResponse = modelMapper.map(productPriceEntity, ProductPriceResponse.class);
return ResponseEntity.created(location).body(productPriceResponse);
}
ProductPriceResponse (é um DTO)
@Getter @Setter
public class ProductPriceResponse {
...
private String supermarket;
private String store;
...
}
Isso funciona mas eu não consigo fazer o retorno do DTO. Supermarket e store ficam como null em ProductPriceResponse.
Bom, então eu mudei o Cascade do atributo store.
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "SUPERMARKET_STORE_ID", nullable = false)
private SupermarketStoreEntity store;
E ai eu recebo este erro:
"detached entity passed to persist: model.SupermarketStoreEntity; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: model.SupermarketStoreEntity"
faz sentido. Modelmapper converte o Long storeId para SupermarketStoreEntity apenas com o id preenchido… e provavelmente detached …
Agora finalmente minha dúvida: Qual é a melhor prática?
Eu devo receber o storeId do DTO e não converter em SupermarketStoreEntity detached e sim fazer um find SupermarketStoreEntity com o storeId para que não fique detached?
Ou nao. Devo remover o cascade e depois que salvar o ProductPriceEntity eu deveria obter o ProductPriceEntity salvo? Eu acredito que não deve funcionar…pq sem o cascade não vai vir o relacionamento store.
Valeu pessoal pela ajuda