Spring JPA加载ManyToOne关系的最有效方法



我有一个名为StoreQuantity的实体,它存储商店中所有产品/项目的当前库存数量:

@Data
@Entity
@Table(name = "STORE_QUANTITY")
public class StoreQuantity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "STORE_QUANTITY_ID", nullable = false)
private int storeQuantityId;
@ManyToOne
@JoinColumn(name = "PRODUCT_ID", nullable = false)
private Product product;
@Column(name = "INSTORE_QUANTITY")
private int instoreQuantity;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "STORE_ID", nullable = false)
private Store store;
}

对应的门店实体:@实体@表(name="store"(公共类Store实现Serializable{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "STORE_ID", nullable = false)
private int storeId;
@Column(name = "NAME", nullable = false)
private String name;
@JsonIgnore
@OneToMany(mappedBy = "store")
private List<StoreQuantity> storeQuantityList;
}

我正在尝试检索所有商店中的所有产品数量,并导出为csv。我目前想了两种方法:

在一次调用中检索整个门店数量表,并将每个门店数量打印为csv。

public String currentStoreQuantitiesCSV() {
List<StoreQuantity> storeQuantityList = storeQuantityRepository.findAllByOrderByStoreDesc();
for (StoreQuantity storeQuantity : storeQuantityList) {
//StoreId
csvString.append(storeQuantity.getStore().getStoreId()).append(',');
//ProductId
csvString.append(storeQuantity.getProduct().getProductId());
//Product Quantity
csvString.append(storeQuantity.getInstoreQuantity());
csvString.append(',');
}

或者我通过商店给他们打电话:

public String currentStoreQuantitiesCSV() {
List<Store> storeList = storeRepository.findAll();
for (Store store:storeList){
List<StoreQuantity> storeQuantityList = store.getStoreQuantityList();
for (StoreQuantity storeQuantity : storeQuantityList) {
//Store Name
csvString.append(storeQuantity.getStore().getName()).append(',');
//ProductId
csvString.append(storeQuantity.getProduct().getProductId());
//Product Quantity
csvString.append(storeQuantity.getInstoreQuantity());
csvString.append(',');
}
}

它们都能工作,现在只是效率和内存利用率的问题。我读到默认情况下,JPA会急切地加载任何ManyToOne关系:Hibernate中一对一、多对一和一对多的默认获取类型那么,这是否意味着,如果我选择选项1,每个storequantity对象都会有同样多的存储对象副本?这将是非常糟糕的,因为我只有20家左右的商店,但有成千上万的商店数量,而且每个商店都加载了自己的商店对象,这将是很糟糕的。还是每个storequantity都指向同一个storeObjects?我只考虑方法二,因为这样内存中就不会有太多存储对象。

我对堆栈内存进行了一些测试,似乎JPA会自动将所有ManyToOne关系映射到一个对象。例如,在这种情况下,我们有一个商店,10个商店数量有一个ManyToOne到那个商店。JPA将只实例化一个存储对象,并将所有10个storequantity对象指向该存储,而不是为每个storequantities对象创建一个存储。因此,当我们减少数据库调用量时,选项1将是最有效的。

最新更新