【问题标题】:OneToMany using a Map: Order has items, each item has quantity使用 Map 的 OneToMany:订单有项目,每个项目都有数量
【发布时间】:2013-07-25 14:31:41
【问题描述】:

我必须设计数据库,以便我有一个名为 Item 的表(待售)。当一个项目被创建时,它的一部分就是数量。所以我打算有一个表item_qty,里面有item_id和数量(店主原来的数量)。

现在客户会在网上看到此商品并下订单。所需的设计是这样一个订单可以有很多项目,每个项目都有一个关联的数量(这是来自客户的数量,例如我想买 2 支笔)。

理想情况下,我希望 Order 类具有: Map<Item, Integer> items; 其中整数字段用于数量。 和一个对应的表 Order_items 有 (order_id, item_id, requested_qty)。

这是正确的方法吗?如果不是 - 最好的方法是什么。显然,使用我拥有的当前代码:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@MapKeyJoinColumn(name="id")
public Map<Item, Integer> getItem() {
    return item;
}

我得到:

原因:org.hibernate.AnnotationException:使用@OneToMany 或@ManyToMany 针对未映射的类:com.test.shop.jpa.entity.Order.item[java.lang.Integer]

包括 Hibernate 在内的许多教程都建议使用不同的用例,例如 Customer 将 Orders 映射为 orderId:Order 等,这显然不是我的情况。

请提出最佳方法,我会尽力实施。

提前致谢, 穆斯塔法

【问题讨论】:

    标签: hibernate jpa hashmap one-to-many


    【解决方案1】:

    我认为这是不可能的。映射的结构也必须是实体。可以定义一个仅包含整数的实体以提供值。

    但也许你看看@ElementCollection。顺便提一句。为什么不简单地将这个值添加到 Item 中?

    【讨论】:

    • 项目本身就是一个实体,所以我想保持数量不同。我通过拥有一个新实体 OrderedItem 来做到这一点,该实体引用了 Item、Order 并且也有一个数量字段。谢谢你的回答。
    【解决方案2】:

    你可以这样做:

    @ElementCollection
    @CollectionTable(name="item_qty",
        joinColumns=@JoinColumn(name="parententity_id"))
    @MapKeyJoinColumn(name="item_id")
    @Column(name="qty")
    private Map<Item, Integer> item;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2014-11-01
      • 1970-01-01
      • 2013-07-13
      • 2012-05-20
      相关资源
      最近更新 更多