【问题标题】:Is it possible to refer @JoinColumn from one FK to the other column in another FK in JPA/hibernate?是否可以将 @JoinColumn 从一个 FK 引用到 JPA/hibernate 中另一个 FK 中的另一列?
【发布时间】:2015-12-04 02:25:19
【问题描述】:

我猜这些问题似乎令人困惑。

库存实体

@Entity
@IdClass(InventoryPK.class)
public class Inventory {

    @Id
    @ManyToOne(optional = false)
    @JoinColumn(name = "product_id",
                referencedColumnName = "product_id")
    private Product product;

    @Id
    @ManyToOne(optional = false)
    @JoinColumn(name = "store_id", 
                referencedColumnName = "store_id")
    private Store store;    

    @Column()
    private int stock;

    @Column(precision = 2)
    private double price;
}

订单实体

@Entity
public class SalesOrder {

    @Id
    @Column(name = "order_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @ManyToOne(optional = false)
    @JoinColumn(name = "customer_id", 
                referencedColumnName = "customer_id")
    private Customer customer;

    @ManyToOne(optional = false)
    @JoinColumn(name = "store_id", 
                referencedColumnName = "store_id")
    private Store store;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "order_date")
    private Date orderDate;

    @OneToMany(mappedBy = "order")
    private List<OrderDetails> details;
}

订单详情实体

@Entity
@IdClass(OrderDetailsPK.class)
public class OrderDetails {

    @Id
    @ManyToOne(optional = false)
    @JoinColumn(name = "order_id", 
                referencedColumnName = "order_id")
    private SalesOrder order;

    @Id
    @ManyToOne(optional = false)
    @JoinColumns({
        @JoinColumn(name="product_id", 
                    referencedColumnName="product_id"),
        @JoinColumn(name="store_id", 
                    referencedColumnName="store_id"),
    })
    private Inventory inventory;

    @Column()
    private int quantity;
}

那些实体会生成下表

订单实体

order_id  |  customer_id   |  store_id   |  order_date
======================================================

订单详情实体

order_id  |  product_id   |  store_id   |  quantity
======================================================

我可以将OrderDetails 中的store_id 链接到SalesOrder 中的store_id,这样我就不需要在OrderDetails 中指定它了吗?我的意思是表格应该如下所示。

订单实体

order_id  |  customer_id   |  store_id   |  order_date
======================================================

订单详情实体

order_id  |  product_id   |  quantity
=====================================

为什么?我认为我不需要在OrderDetails 中指定store_id,因为信息已经在SalesOrder 中。要获得Store,我可以使用OrderDetails#Order#Store。但是,目前我需要指定store_id,因为它是Inventory 中的PK。我可以将Inventorystore_id 链接到Order 的那个吗?

【问题讨论】:

  • Inventry 有 store_id,OrderEntity 有 store_id。为什么要在 OrderDetails 实体中跟踪库存?
  • 因为OrderDetails是客户在商店购买的产品列表,并且每个商店的产品列表不同。我将Product 的列表放在Inventory 的商店中。
  • 所以,让库存包含产品列表,并在 OrderDetails 中保留库存的 ID(库存 ID)。它对你有用吗?我认为这是您设计的问题。
  • 所以,你的意思是我需要为Inventory添加一个专用的PK?目前我使用product_idstore_id 作为Inventory 的PK,因为这两列对于每条记录都是唯一的。
  • 什么是不同客户的订单,他/她从同一个 store_id 购买了相同的 product_id ?不会有冲突吗?

标签: java spring hibernate jpa spring-boot


【解决方案1】:

是的……这就是我们所说的多对多关系。 使用@ManyToMany 注解来实现这个... 示例:-http://www.java2s.com/Tutorial/Java/0355__JPA/ManyToManyJoinTableJoinInverseJoinColumn.htm

【讨论】:

  • 当一个SalesOrder 可以有多个OrderDetails,而一个OrderDetails 不能有多个SalesOrder 时,为什么我要在SalesOrder-OrderDetails 上拥有@ManyToMany 关系?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
相关资源
最近更新 更多