Я работаю над проектом Spring Boot с JPA/Hibernate. У меня есть продукт сущности, который выглядит так: < /p>
@Entity
@Table(name = "PRODUCTS")
@AttributeOverride(name = "id", column = @Column(name = "product_id"))
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@SuperBuilder
public class Product extends BaseEntity {
@Column(name = "name", nullable = false, length = 500)
private String name;
@Column(name = "description", length = 500)
private String description;
@Column(name = "price", nullable = false)
private Double price;
@Column(name = "stock", nullable = false)
private Integer stock;
@ManyToMany
@JoinTable(
name = "PRODUCT_CATEGORIES",
joinColumns = @JoinColumn(name = "product_id"),
inverseJoinColumns = @JoinColumn(name = "category_id")
)
private Set categories;
@ManyToMany
@JoinTable(
name = "PRODUCT_PROVIDERS",
joinColumns = @JoinColumn(name = "product_id"),
inverseJoinColumns = @JoinColumn(name = "provider_id")
)
private Set
providers;
@OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
private Set orderDetail;
@OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
private Set purchases;
}
< /code>
Как вы можете видеть, некоторые ассоциации помечены как fetch = fetchtype.lazy.
Однако, когда я возвращаю продукт из моего REST API, JSON все еще включает в себя все связанные сущности (поставщики, категории, покупки и т. Д.).@Mapper(componentModel = "spring", uses = {IProductMapper.class, IProviderMapper.class})
public interface IPurchaseMapper {
@Mapping(target = "id", ignore = true)
@Mapping(target = "provider", expression = "java(new Provider(dto.getProviderId()))")
@Mapping(target = "product", expression = "java(new Product(dto.getProductId()))")
Purchase toEntityCreate(PurchaseDto dto);
}
@PostMapping
public ResponseEntity createPurchase(
@Validated(OnCreate.class) @RequestBody PurchaseDto purchaseDto
){
final var purchase = purchaseMapper.toEntityCreate(purchaseDto);
final var createdPurchase = purchaseService.create(purchase);
return ResponseEntity.ok(
purchaseMapper.toDTO(createdPurchase)
);
}
< /code>
и служба: < /p>
@Transactional
public Purchase create(Purchase purchase){
validatePurchase(purchase);
long idProduct = purchase.getProduct().getId();
final Long idProvider = purchase.getProvider().getId();
final Provider provider = providerService.getByProductIdAndProvideId(idProvider, idProduct);
purchase.setStatus(PurchaseStatus.OK);
final Product productUpdated = productService.updateStock(idProduct, purchase.getQuantity());
final Purchase purchaseSaved = purchaseRepository.save(purchase);
purchaseSaved.setProduct(productUpdated);
purchaseSaved.setProvider(provider);
return purchaseSaved;
}
public Product updateStock(Long idProduct, Integer quantity) {
Product product = getById(idProduct);
final int newStock = product.getStock() + quantity;
if (newStock < 0) throw new BadRequestException("Stock cannot be negative");
product.setStock(newStock);
return productRepository.save(product);
}
< /code>
Несмотря на то, что я никогда явно не называю Getters поставщиков, категорий, покупок и т. Д., Ответ JSON все еще включает в себя все из них. Но я ожидал, что если я не получаю доступ к ассоциациям в моем коде, они останутся разгруженными и не появятся в JSON. Должен ли я:
использовать @jsonignore на ассоциациях,
Настроить модули Jackson/hibernate>
Подробнее здесь: https://stackoverflow.com/questions/797 ... -i-never-a