gpt4 book ai didi

java - 如何使用 JPA 和 Hibernate 映射集合的最新子项

转载 作者:搜寻专家 更新时间:2023-11-01 02:24:17 24 4
gpt4 key购买 nike

我有一个 Product 实体类,我希望它与 Price 表连接。

我的目标是保留旧价格以进行报告,当我获得 Product 实体时,它应该根据最新日期映射到最新价格。

请解释一下如何在 Hibernate JPA 关系中实现这一点。如果可能的话分享一个代码片段。

最佳答案

您的域模块可以使用 @JoinFormula ,像这样:

@Entity
public class Product {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String name;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "product", orphanRemoval = true)
private List<Price> prices = new ArrayList<>();

@ManyToOne
@JoinFormula(
"(SELECT id FROM price ORDER BY created_on DESC LIMIT 1)"
)
private Price latestPrice;

public void setName(String name) {
this.name = name;
}

public List<Price> getPrices() {
return prices;
}

public void addPrice(BigDecimal priceValue) {
Price price = new Price();
price.setPrice(priceValue);
prices.add(price);
price.setProduct(this);
latestPrice = price;
}

public Price getLatestPrice() {
return latestPrice;
}
}

@Entity(name = "Price")
public class Price {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@ManyToOne
private Product product;

@Column(name = "created_on", nullable=false, updatable=false)
private Date createdOn;

private BigDecimal price;

public void setProduct(Product product) {
this.product = product;
}

public BigDecimal getPrice() {
return price;
}

public void setPrice(BigDecimal price) {
this.price = price;
}

@PrePersist
public void prePersist() {
createdOn = new Date();
}
}

这是更新产品价格的方式:

Long id = ...;
BigDecimal newPriceValue = ...;

Product product = entityManager.find(Product, id);
Price oldPrice = product.getLatestPrice();

product.addPrice(newPriceValue);

关于java - 如何使用 JPA 和 Hibernate 映射集合的最新子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29403778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com