java - JPA 使用 Map<ID, Entity> 而不是 List<Entity>

标签 java spring hibernate jpa

我正在使用 Spring JPA 设计电子商务应用程序。假设我有 2 个类 ProductOption具有一对多关系,即 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/

相关文章:

java - 空 EntityManager Spring 4

java - 我可以将构建器设计模式与 hibernate 一起使用吗?

java - 如何将带有运算符的字符串解析为整数?

java - 要编写用于分析 Java 源代码的 Eclipse 插件,我必须知道哪一部分?

java - 重新登录 Flex 导致 Channel.Connect.Failed 错误 NetConnection.Call.Failed : HTTP: Status 500: url

java - 用枚举初始化 bean 的属性怎么样?

JAVA:如何将 JsonObject 更新为另一个 JsonObject

spring - 如何解决此 bean 定义覆盖问题?

java.io.FileNotFoundException : class path resource can't be opened

java - Spring 应用程序失败,Autowire 在 main.class 中为 null