sql >> Database teknologi >  >> RDS >> Mysql

Mange til Mange inde Mange til Mange Table

Dette er faktisk et godt spørgsmål, der er værd at undersøge og eksperimentere. Der er mange måder at lave kortlægningen på. At komme med et bedre design vil faktisk afhænge af dine applikationsbehov. Men her er, hvordan jeg tror, ​​det ville være en effektiv måde at implementere kortlægningen på:

Jeg har 3 separate enheder til Order , Product og Address .

Vi implementerer ikke det sædvanlige mange-til-mange-forhold mellem de 2 entiteter, Order og Product , hvor hver side har en samling af den anden. I stedet vil jeg oprette en anden enhed til at repræsentere forholdet mellem Order og Product , og lad os kalde det ProductOrder . Sådan kortlægges deres forhold:

  • Order har et-til-mange-forhold til ProductOrder .
  • ProductOrder har mange-til-en-relation med Order .
  • Product har et-til-mange-forhold til ProductOrder .
  • ProductOrder har mange-til-en-relation med Product .

ProductOrder 's primære nøgle vil være sammensat af den primære nøgle til Order og primærnøgle til Product - så dette bliver en sammensat nøgle. Derfor bliver vi nødt til at bruge @IdClass at kortlægge sammensatte nøgler.

Nu, her er tricket til at opnå mange-til-mange i et mange-til-mange-forhold:

ProductOrder har mange-til-mange forhold til Address .

Se eksempelkoder for hver enhed nævnt ovenfor:

ORDREENHED

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

PRODUKTENTITET

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

ADRESSEENTITET

@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 ENTITY

@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 for ProductOrder-enhed

public class ProductOrderId {

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

Her er et eksempel på en kode til at oprette entiteterne og bevare dem:

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

Her er, hvordan skemaet blev genereret i MySQL-databasen:

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. php begrænsning overtrædelse Fejl 1452

  2. Nth højeste løn

  3. Best Practices for PostgreSQL-sikkerhed

  4. Oracle Concurrent Manager