Java JPA使用地图<;ID,实体>;而不是列表<;实体>;

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

我正在使用SpringJPA设计一个电子商务应用程序。假设我有两个具有一对多关系的类
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
over
Map
?我是否可以始终使用
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));