Titel: Warum sind alle faulen Verbände in meiner JSON -Antwort serialisiert, auch wenn ich nie auf sie zugegriffen habe?Java

Java-Forum
Anonymous
 Titel: Warum sind alle faulen Verbände in meiner JSON -Antwort serialisiert, auch wenn ich nie auf sie zugegriffen habe?

Post by Anonymous »

Ich arbeite an einem Spring Boot -Projekt mit JPA/Hibernate. Ich habe ein Entitätsprodukt, das so aussieht: < /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>
Wie Sie sehen können, werden einige Assoziationen als Fetch = fetCtType markiert.@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>
und der Dienst: < /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>
Obwohl ich nie explizit die Getter von Anbietern, Kategorien, Einkäufen usw. anrufe, enthält die Antwort JSON immer noch alle. Aber ich erwartete, dass, wenn ich nicht auf die Assoziationen in meinem Code zugegriffen habe, sie nicht geladen bleiben und nicht im JSON erscheinen würden. Sollte ich:
@jsonignore in Assoziationen verwenden,
Jackson/Hibernate -Module anders konfigurieren>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post