Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多对多表中的多对多_Java_Mysql_Hibernate_Jpa_Many To Many - Fatal编程技术网

Java 多对多表中的多对多

Java 多对多表中的多对多,java,mysql,hibernate,jpa,many-to-many,Java,Mysql,Hibernate,Jpa,Many To Many,我有一个表Orders,其中包含产品的列表。对于与特定订单相对应的每个产品,我需要存储一个地址列表,其中单个产品(每个订单,每个产品)应交付给 +----------------+------------+ | Order_ID | Product_ID | +----------------+------------+ | 1 | 1000 | | 2 | 1000 | | 2 |

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

+----------------+------------+
|    Order_ID    | Product_ID |
+----------------+------------+
| 1              |       1000 |
| 2              |       1000 |
| 2              |       1001 |
+----------------+------------+
因此,我有一个关于订单产品的多对多表,我需要将上表中的每个条目映射到地址列表。所以我需要像这样的东西

|PK|Order_ID |Product_ID |    
| 1|    1    |  1000     |
| 2|    2    |  1000     |
| 3|    2    |  1001     | 
要将上表中的条目映射到地址列表,我需要在上面的PK和地址ID(我的地址表的主键)上再创建一个多对多表

这里PK_Order_Product是上一个表主键(PK)上的外键
我使用JPA来持久化我的MYSQL数据库,如果我的设计是正确的,请帮助我编写一个代码片段。如何在Java中使用JPA注释来实现这一点,这实际上是一个值得研究和实验的好问题。有许多方法可以进行映射。提出更好的设计实际上取决于您的应用程序需求。但以下是我认为实施映射的有效方法:

我将为
订单
产品
地址
创建3个单独的实体

我们不会在两个实体之间实现通常的多对多关系,
订单
产品
,其中每一方都有另一方的集合。相反,我将创建另一个实体来表示
Order
Product
之间的关系,并将其命名为
ProductOrder
。以下是它们之间关系的映射方式:

  • Order
    ProductOrder
    有一对多关系
  • ProductOrder
    Order
    有多对一关系
  • 产品
    产品订单
    有一对多关系
  • ProductOrder
    Product
    有多对一关系
ProductOrder
的主键将由
Order
的主键和
Product
的主键组成-因此这将是一个复合键。因此,我们需要使用
@IdClass
来映射复合键

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

ProductOrder
地址有多对多关系

参见上述各实体的示例代码:

订单实体

@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>();
...
}
@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>();
...
}
@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>();
...
}
@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>();
...
}

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

    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数据库中如何生成架构:

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)

你的问题是什么?这个设计正确吗?能给我一个更好的设计吗。如果是,我如何使用JPAJPA实现这一点是围绕类设计的。发布您的类类顺序{long orderId;}我收到以下错误,原因是:org.hibernate.MappingException:在org.hibernate.mapping.Table(ADDRESS)及其相关的超表和辅助表中找不到逻辑名称为ADDRESS_ID的列。您能帮我解决这个问题吗
@Entity@Table(name=“ADDRESS”)公共类地址实现了可序列化的,IEntity{private static final long serialVersionUID=1L;@Id@GeneratedValue(strategy=GenerationType.IDENTITY)@Column(name=“Address_Id”)private long pk;@Column(name=“Address_name”,nullable=false,length=255)private String addressName;}
是否使用hbm2ddl auto?是否设置为创建或更新?好的,请更新问题并发布所有实体的代码,以便我们可以看到所有映射(如果它们被正确声明)。注释部分中的张贴代码不可读。或者任何您认为更快共享信息的方法…上面提供的解决方案的复制粘贴是您提供的解决方案吗?
    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();
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)