Java JPA使用地图<;ID,实体>;而不是列表<;实体>;
我正在使用SpringJPA设计一个电子商务应用程序。假设我有两个具有一对多关系的类Java JPA使用地图<;ID,实体>;而不是列表<;实体>;,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我正在使用SpringJPA设计一个电子商务应用程序。假设我有两个具有一对多关系的类Product和Option,即Product将有多个选项,而选项只属于一个产品。这样,典型的JPA映射将是 @Entity(name = "products") class Product { @Id @Column(name = "product_id") private Long productId; @OneToMany(cascade = ALL, orphanRemo
Product
和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
}
使用Map
,我认为它对于更新和删除选项非常有用。例如,通过使用列表
,当我想从产品
中删除一个选项
时,如果给定一个选项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);
}
问题
一般来说,是否有理由对一对多关联使用
List
overMap
?我是否可以始终使用Map
?我认为您可以使用List
并使用removeIf()方法删除选项。
正如@JB Nizet所说,最好使用Set
来避免重复选项
p.getOptions().removeIf(option->option.getOptionId().equals(optionId));
我认为您可以使用List
,对于delete选项,可以使用removeIf()
方法。删除选项非常容易。您可以使用带有@Convert
注释的自定义转换器,它可以从列表中创建映射
。首先,您应该使用集合而不是列表。其次,removeIf()几乎和从映射中删除一样容易使用。但最有问题的部分是,通常在创建选项时,选项还没有ID,因此无法存储在地图中。还要注意,调用productRepository.save(p);没用。JPA实体是托管的(在事务内部):您对托管实体所做的任何更改都会自动持久化。@谢谢,我愿意接受您的答案,您能否将其作为答案重新发布。真正的问题是:如果不是为了持久化,您是否会以映射的形式对关联进行建模?我怀疑id
属性,如果存在的话,是否会如此重要
public void deleteOption(Long productId, Long optionId) {
Product p = productRepository.findByProductId(productId);
p.getOptions.remove(optionId);
productRepository.save(p);
}
p.getOptions().removeIf(option->option.getOptionId().equals(optionId));