Spring Boot Api Rest com DTO e @ManyToOne - Melhores práticas

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.

image

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