首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多对多,多对多表

多对多,多对多表
EN

Stack Overflow用户
提问于 2015-10-17 01:20:01
回答 1查看 1.3K关注 0票数 2

我有一个表Orders,其中包含Products的列表。对于每个与特定订单相对应的产品,我需要存储一个地址列表,其中单个产品(每个产品的订单)应该交付到

代码语言:javascript
复制
+----------------+------------+
|    Order_ID    | Product_ID |
+----------------+------------+
| 1              |       1000 |
| 2              |       1000 |
| 2              |       1001 |
+----------------+------------+

因此,我有这个表,它对许多人来说是关于、Orders、Products的,我需要的是将上表中的每个条目映射到Addresses列表中。所以我需要这样的东西

代码语言:javascript
复制
|PK|Order_ID |Product_ID |    
| 1|    1    |  1000     |
| 2|    2    |  1000     |
| 3|    2    |  1001     | 

要将上表中的一个条目映射到地址列表,我需要更多的地址到上面PK和地址ID的多个表(我的地址表的主键)。

代码语言:javascript
复制
|PK_Order_Product |Address_ID|
|    1            |  1       |
|    2            |  1       |
|    2            |  3       |

这里,PK_Order_Product是上一个表的主键(PK)上的外键,我使用JPA来持久化我的MYSQL -如果我的设计是用correct.How使用JPA注释来实现这一点,请帮助我编写一个代码片段

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-17 19:39:42

这其实是一个值得研究和试验的好问题。有许多方法来进行映射。想出一个更好的设计实际上取决于您的应用程序需求。但我认为这将是实现映射的一种有效方法:

我将为OrderProductAddress创建3个独立的实体。

我们将不会实现两个实体( OrderProduct )之间通常的多对多关系,在这两个实体中,每一方都有另一方的集合。相反,我将创建另一个实体来表示OrderProduct之间的关系,让我们将其命名为ProductOrder。下面是他们之间关系的映射方式:

  • OrderProductOrder有一对多的关系.
  • ProductOrderOrder有着多对一的关系.
  • ProductProductOrder有一对多的关系.
  • ProductOrderProduct有着多对一的关系.

ProductOrder的主键将由Order的主键和Product的主键组成,因此这将是一个复合键,因此我们需要使用@IdClass来映射复合键。

现在,要在多到多的关系中实现多对多的关系,以下是诀窍:

ProductOrderAddress有着多到多的关系.

见上文提到的每个实体的样本代码:

订单实体

代码语言:javascript
复制
@Entity
@Table(name = "ORDERS")
public class Order {

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

    private int quantity;

    @OneToMany(mappedBy = "order")
    private List<ProductOrder> productOrderList = new ArrayList<ProductOrder>();
...
}

产品实体

代码语言:javascript
复制
@Entity
@Table(name="PRODUCT")
public class Product {

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

    private String name;

    @OneToMany(mappedBy = "product")
    private List<ProductOrder> productOrderList = new ArrayList<ProductOrder>();
...
}

地址实体

代码语言:javascript
复制
@Entity
@Table(name="ADDRESS")
public class Address {

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

    private String state;

    @ManyToMany(mappedBy = "addressList")
    private List<ProductOrder> productOrderList = new ArrayList<ProductOrder>();
...
}

PRODUCTORDER实体

代码语言:javascript
复制
@Entity
@Table(name="PRODUCT_ORDER")
@IdClass(ProductOrderId.class)
public class ProductOrder {

    @Id
    @ManyToOne
    @JoinColumn(name="ORDER_ID")
    private Order order;

    @Id
    @ManyToOne
    @JoinColumn(name="PRODUCT_ID")
    private Product product;

    @ManyToMany
    @JoinTable(name="PRODUCT_ORDER_ADDRESS",
            joinColumns={@JoinColumn(name="ORDER_ID", referencedColumnName="ORDER_ID"),
                    @JoinColumn(name="PRODUCT_ID", referencedColumnName="PRODUCT_ID")},
            inverseJoinColumns=@JoinColumn(name="ADDRESS_ID", referencedColumnName="ADDRESS_ID"))
    private List<Address> addressList = new ArrayList<Address>();
...
}

@IdClass用于ProductOrder实体

代码语言:javascript
复制
public class ProductOrderId {

    private Long order;
    private Long product;
...
}

下面是创建实体并将其持久化的示例代码:

代码语言:javascript
复制
    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();

    Order order = new Order();
    order.setQuantity(10);
    em.persist(order);

    Product product = new Product();
    product.setName("Coffee");
    em.persist(product);

    Address address = new Address();
    address.setState("CA");
    em.persist(address);

    ProductOrder productOrder = new ProductOrder();
    productOrder.setOrder(order);
    productOrder.setProduct(product);

    productOrder.getAddressList().add(address);
    address.getProductOrderList().add(productOrder);

    em.persist(productOrder);

    em.getTransaction().commit();

下面是如何在MySQL数据库中生成模式:

代码语言:javascript
复制
Hibernate: 
    create table ADDRESS (
        ADDRESS_ID bigint not null auto_increment,
        state varchar(255),
        primary key (ADDRESS_ID)
    )
Hibernate: 
    create table ORDERS (
        ORDER_ID bigint not null auto_increment,
        quantity integer not null,
        primary key (ORDER_ID)
    )
Hibernate: 
    create table PRODUCT (
        PRODUCT_ID bigint not null auto_increment,
        name varchar(255),
        primary key (PRODUCT_ID)
    )
Hibernate: 
    create table PRODUCT_ORDER (
        ORDER_ID bigint,
        PRODUCT_ID bigint,
        primary key (ORDER_ID, PRODUCT_ID)
    )
Hibernate: 
    create table PRODUCT_ORDER_ADDRESS (
        ORDER_ID bigint not null,
        PRODUCT_ID bigint not null,
        ADDRESS_ID bigint not null
    )
Hibernate: 
    alter table PRODUCT_ORDER 
        add constraint FK_sl39bwx60xjbvoiujpaes74ty 
        foreign key (ORDER_ID) 
        references ORDERS (ORDER_ID)
Hibernate: 
    alter table PRODUCT_ORDER 
        add constraint FK_n0i7uxq6rxsc0mcred1cds4m9 
        foreign key (PRODUCT_ID) 
        references PRODUCT (PRODUCT_ID)
Hibernate: 
    alter table PRODUCT_ORDER_ADDRESS 
        add constraint FK_kad6crei9lgrv1nuuuff42vs8 
        foreign key (ADDRESS_ID) 
        references ADDRESS (ADDRESS_ID)
Hibernate: 
    alter table PRODUCT_ORDER_ADDRESS 
        add constraint FK_hpx0e467dvpqi5i6kxmujns2b 
        foreign key (ORDER_ID, PRODUCT_ID) 
        references PRODUCT_ORDER (ORDER_ID, PRODUCT_ID)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33181733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档