【问题标题】:How to represent a Map<EntityType, Integer> relation using JPA?如何使用 JPA 表示 Map<EntityType, Integer> 关系?
【发布时间】:2018-06-12 18:16:51
【问题描述】:

我有一个Order 实体和一个Product 实体。一个订单可能有若干对,分别代表产品和售出的数量。 JPA 中有什么合适的关系来表示它?

(到目前为止,我只找到了将 EntityA 的集合与 EntityB 相关联的方法。例如,EntityA 包含一个List&lt;EntityB&gt;。)

【问题讨论】:

标签: java spring hibernate jpa


【解决方案1】:

你必须像

这样映射实体

在 Order.jave 中

 @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "order_Id")
    @JsonBackReference
    private List<Product> product = new ArrayList<Product>();

在 Product.jave 中

@ManyToOne
    @JoinColumn(name = "product_Id", referencedColumnName = "product_Id", nullable = false, insertable = false, updatable = false)
    @JsonBackReference
    private Order order;

【讨论】:

    【解决方案2】:

    如果数量是这个关联的全部,并且您不需要从 ProductOrder 导航,则可以将 Integer quantity 视为元素集合并执行以下操作 - Product 保持一样的:

    public class Order {
        @ElementCollection                          // 1
        @CollectionTable(name="ORDER_PRODUCT_QTY")  // 2
        @MapKeyJoinColumn(name="PRODUCT_ID")        // 3
        @Column(name="QUANTITY")                    // 4
        private Map<Product, Integer> quantities;
    }
    
    1. 它是基本类型的集合(数量的整数),由实体键控
    2. 它是多值的,所以需要一个单独的表;您可以选择指定其名称
    3. 单独的集合表将包含指向Order 实体的列、指向Product 的列和数量值本身的列。这允许您设置引用 Product 表的 FK 的名称,并且是可选的。
    4. 这使您可以指定保存数量值的列的名称。也是可选的。

    如果您有理由相信这还不够,那么您可能需要创建一个代表关联的不同实体,例如:

    OrderOrderItemProduct

    Order有很多OrderItems,Product有很多OrderItems,Order有很多Products间接通过OrderItemProduct可以在很多Orders中找到,间接通过OrderItem,数量在OrderItem。将这种“与价值的关系”表示为实体比集合映射更灵活。

    【讨论】:

      【解决方案3】:

      我也在使用上面的代码,但它不适合我。 下面是我的代码。

      @ElementCollection(fetch = FetchType.EAGER)
      @CollectionTable(name="content_package_component_level_languages_language_assessment_map", joinColumns=@JoinColumn(name="id"))
      @MapKeyJoinColumn(name="language_assessment_map_key", referencedColumnName = "id")
      @Column(name="language_assessment_map")
      private Map<Lang, Integer> languageAssessmentMap;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多