Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Nhiều đến nhiều bên trong Nhiều đến nhiều bàn

Đây thực sự là một câu hỏi hay đáng để chúng ta nghiên cứu và thử nghiệm. Có nhiều cách để thực hiện việc lập bản đồ. Đưa ra một thiết kế tốt hơn thực sự sẽ phụ thuộc vào nhu cầu ứng dụng của bạn. Nhưng đây là cách tôi nghĩ sẽ là một cách hiệu quả để triển khai ánh xạ:

Tôi sẽ có 3 thực thể riêng biệt cho Order , ProductAddress .

Chúng tôi sẽ không triển khai mối quan hệ nhiều-nhiều thông thường giữa 2 thực thể, OrderProduct , nơi mỗi bên có một bộ sưu tập của bên kia. Thay vào đó, tôi sẽ tạo một thực thể khác để đại diện cho mối quan hệ giữa OrderProduct và đặt tên cho nó là ProductOrder . Đây là cách các mối quan hệ của họ được ánh xạ:

  • Order có mối quan hệ một-nhiều với ProductOrder .
  • ProductOrder có mối quan hệ nhiều-một với Order .
  • Product có mối quan hệ một-nhiều với ProductOrder .
  • ProductOrder có mối quan hệ nhiều-một với Product .

ProductOrder khóa chính của sẽ bao gồm khóa chính của Order và khóa chính của Product - vì vậy đây sẽ là một khóa tổng hợp. Do đó, chúng tôi sẽ cần sử dụng @IdClass để ánh xạ các khóa tổng hợp.

Bây giờ, đây là mẹo để đạt được nhiều-nhiều trong mối quan hệ nhiều-nhiều:

ProductOrder có mối quan hệ nhiều-nhiều với Address .

Xem các mã mẫu cho từng thực thể được đề cập ở trên:

ENTITY ĐẶT HÀNG

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

QUYỀN LỢI CỦA SẢN PHẨM

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

ĐỊA CHỈ ENTITY

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

QUYỀN LỢI CỦA NGƯỜI SẢN XUẤT

@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")},
            [email protected](name="ADDRESS_ID", referencedColumnName="ADDRESS_ID"))
    private List<Address> addressList = new ArrayList<Address>();
...
}

@IdClass cho thực thể ProductOrder

public class ProductOrderId {

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

Đây là mã mẫu để tạo các thực thể và duy trì chúng:

    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();

Đây là cách lược đồ được tạo trong cơ sở dữ liệu 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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL tách các ký tự không phải số để so sánh

  2. Hàm MySQL LOG () - Trả về Logarit tự nhiên của một giá trị

  3. Lỗi Nifi PutSQL Timestamp / Datetime error không thể chuyển đổi được

  4. Làm thế nào để truy cập kết nối mysqli trong một lớp khác trên trang khác?

  5. Mysql, định hình lại dữ liệu từ dài / cao sang rộng