【问题标题】:How to Handle Additional Attributes in Many to Many Table in POJOs when Access Patterns Rely on One to Many?POJO中多对多表的附加属性在访问模式依赖一对多时如何处理?
【发布时间】:2014-04-05 04:55:12
【问题描述】:
CREATE TABLE order (
    order_id INT
    ,...
    ,CONSTRAINT ... PRIMARY KEY (order_id)
);
CREATE TABLE item (
    item_id INT
    ,item_list_price DECIMAL(10,2)
    ,...
    , CONSTRAINT ... PRIMARY KEY (item_id)
);
CREATE TABLE order_item (
    order_id INT
    ,item_id INT
    ,order_item_current_price DECIMAL(10,2);
    ,CONSTRAINT ... PRIMARY KEY (order_id, item_id)
    ,CONSTRAINT ... FOREIGN KEY (order_id) ...
    ,CONSTRAINT ... FOREIGN KEY (item_id) ...
);

一个Order 有很多Items;每个Item 可能属于许多Orders。

Item 的价格可以随时更改。为了让客户查看他过去为Item 支付了多少钱,order_item_cost 字段存在于order_item 表中。

当最终用户检查 Items 出售时,它会拉出一个包含项目 ID、名称和 listPrice 的项目列表,而不是 currentPrice(因为 currentPrice 仅与历史报告相关联order,不购买新的item) .

当客户希望查看他的历史购买记录以及他当时为每件商品支付的费用时,它会提取一个包含商品列表的订单,其中包含商品 ID、名称和 currentPrice,但不包含 listPrice(作为listPrice 仅与购买新商品有关,与历史报告无关)。

因此,即使我的关系模式在 Order 和 Item 之间存在多对多关系,我的 POJO 仍认为 Order 和 Item 之间存在一对多关系,因为永远不会存在需要多对多

这是我目前的 POJO(为了简洁起见):

public class Order {
    private int id;
    private String status;
    private Customer customer;
    @OneToMany(mappedBy="order")
    private List<Item> items;
    ...
}
public class Item {
    private int id;
    private String name;
    @ManyToOne
    private Order order;
    private double listPrice; // List price of item, capable of changing over time
    private double currentPrice; // represents the order_item_cost field in order_item table
    ...
}

如您所见,我没有在 Item 类中添加 List&lt;Order&gt;,因为我无法想象需要知道所有可能的 Order 曾经使用过购买的产品和 Item

但是,这感觉不对。我想知道是否应该从Item 中取出currentPrice 成员变量并创建一个名为OrderItem 的新POJO,它反映order_item 表:

public class OrderItem {
    private Order order;
    private Item item;
    private double cost;
}
public class Order {
    @OneToMany(mappedBy="order_item")
    private List<OrderItem> orderItems;
}
public class Item {
    @OneToMany(mappedBy="order_item")
    private List<OrderItem> orderItems;
}

但是,同样,访问模式永远不会要求 Item 找到与其关联的所有订单。 Item 类是否应该改为:

public class Item {
    @OneToMany
    private Order order;
}

或者,有没有更合适的方式来使用 Hibernate 来处理这个问题?

总结:我的数据库有一个多对多模式,因为一个item 可以属于多个orders,每个order 可以有多个items,我希望将价格记录在客户当时购买了该商品,因为item 的标价可以更改。然而,我的应用程序的访问模式只要求它看起来像orderitem 之间的一对多关系。我不确定这应该如何使用 POJO 或休眠来处理。

【问题讨论】:

    标签: java hibernate orm many-to-many one-to-many


    【解决方案1】:

    您肯定需要对 OrderItem 对象进行建模,因为它是一个具有自己的属性(成本)的关系对象。您应该为 Order 1->n OrderItem n->1 Item 建模。数据库应该类似地建模——订单不包含商品,因为价格不是商品价格,而是 order_item 价格。

    【讨论】:

      猜你喜欢
      • 2012-03-01
      • 2011-03-23
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2019-03-27
      • 2016-06-10
      相关资源
      最近更新 更多