我正在使用 Spring JPA 设计电子商务应用程序。假设我有 2 个类 Product
和 Option
具有一对多关系,即 Product
会有很多Option
和一个 Option
只属于一个Product
.有了这个,典型的 JPA 映射将是
@Entity(name = "products")
class Product {
@Id
@Column(name = "product_id")
private Long productId;
@OneToMany(cascade = ALL, orphanRemoval = true)
@JoinColumn(name = "product_id")
private List<Option> options;
// getters, setters
}
请注意 options
的类型是List<Option>
.我正在考虑使用 Map
而不是在这里列出。
@OneToMany(cascade = ALL, orphanRemoval = true)
@JoinColumn(name = "product_id")
@MapKey(name = "optionId")
@MapKeyClass(Long.class)
private Map<Long, Option> options;
使用 Map
,我认为这对更新和删除选项很有用。例如,通过使用 List<Option>
, 当我想删除 Option
来自Product
给定一个选项 id,我会做
public void deleteOption(Long productId, Long optionId) {
Product p = productRepository.findByProductId(productId);
List<Option> options = p.getOptions();
Option toBeRemoved = null;
for (Option o : options) {
if (o.getOptionId == optionId) {
toBeRemoved = o;
}
}
options.remove(toBeRemoved);
productRepository.save(p);
}
但如果我使用 Map
, 会更容易。
public void deleteOption(Long productId, Long optionId) {
Product p = productRepository.findByProductId(productId);
p.getOptions.remove(optionId);
productRepository.save(p);
}
问题
一般来说,有理由使用List<Entity>
吗?在 Map<Long, Entity>
对于一对多关联?我可以一直使用 Map
吗? ?
最佳答案
我认为您可以使用 List
并使用 removeIf()
方法删除选项。
也最好使用 Set
来避免重复选项,正如@JB Nizet 所说。
p.getOptions().removeIf(option->option.getOptionId().equals(optionId));
关于java - JPA 使用 Map<ID, Entity> 而不是 List<Entity>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48020415/