2015-10-17 3 views
1

У меня есть таблица Заказы, которая содержит список Продукты. Для каждого из продуктов, соответствующих определенным порядком мне нужно хранить список Адреса где индивидуальный продукт (согласно заказу на основе продукта) должны быть доставленыОт многих до многих внутри Многие для многих Таблица

+----------------+------------+ 
| Order_ID | Product_ID | 
+----------------+------------+ 
| 1    |  1000 | 
| 2    |  1000 | 
| 2    |  1001 | 
+----------------+------------+ 

Так у меня есть эта таблица, которая много для многих на Заказы и Продукты Мне нужно сопоставить каждую из записей в приведенной выше таблице с списком Адреса. Так что мне нужно что-то вроде

|PK|Order_ID |Product_ID |  
| 1| 1 | 1000  | 
| 2| 2 | 1000  | 
| 3| 2 | 1001  | 

и к карте запись в таблице выше в списке адресов мне нужно еще многие ко многим таблице на выше ПК и адреса ID (первичный ключ моей таблицы адресов)

|PK_Order_Product |Address_ID| 
| 1   | 1  | 
| 2   | 1  | 
| 2   | 3  | 

Здесь PK_Order_Product является внешним ключом на первичном ключе предыдущей таблицы (PK) Я использую JPA для сохраняющейся в мою MYSQL DB Пожалуйста, помогите мне с фрагментом кодом, если мой дизайн correct.How сделать это в Java с использованием аннотаций JPA

+0

Что ваш вопрос ? –

+0

Правильно ли этот дизайн? Могу ли я иметь лучший дизайн. Если да, то как это сделать, используя JPA – Bukhtawar

+0

JPA спроектирован вокруг классов. Оставьте свои классы –

ответ

1

Это действительно хороший вопрос, который стоит каких-то исследований и экспериментов. Существует много способов сделать сопоставление. Придумать лучший дизайн будет зависеть от ваших потребностей приложения. Но вот, как я думаю, было бы эффективным способом реализации картографирования:

У меня будет 3 отдельных объекта для Order, Product и Address.

Мы не будем применять обычные отношения «много-ко-многим» между двумя объектами, Order и Product, где каждая сторона имеет коллекцию другой. Вместо этого я создам другую сущность для представления отношения между Order и Product, и давайте назовем ее ProductOrder. Вот как их отношения отображаются:

  • Order имеет один-ко-многим с ProductOrder.
  • ProductOrder имеет много-однозначные отношения с Order.
  • Product имеет отношение «один ко многим» к ProductOrder.
  • ProductOrder имеет много-однозначные отношения с Product.

ProductOrder «s первичный ключ будет состоять из первичного ключа Order и первичного ключа Product - так это будет составной ключ. Поэтому нам нужно будет использовать @IdClass для отображения составных клавиш.

Теперь, вот уловка, чтобы достичь много-ко-многим в многие-ко-многим:

ProductOrder имеет много-ко-многим с Address.

смотреть коды выборки для каждого объекта, упомянутые выше:

заказ лица

@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 ПРОДУКТ

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

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

@IdClass для ProductOrder лица

public class ProductOrderId { 

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

Вот пример кода для создания объектов и сохраняющиеся их:

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) 
+0

Я получаю следующие ошибки ** Вызвано: org.hibernate.MappingException: Не удалось найти столбец с логическим именем: ADDRESS_ID в org.hibernate.mapping.Table (ADDRESS) и связанные с ним суперостаты и вторичные таблицы * * Можете ли вы помочь мне с решением – Bukhtawar

+0

, можете ли вы разместить свой адресный код объекта? – Ish

+0

'@Entity @Table (name =" ADDRESS ") public class Address реализует Serializable, IEntity { \t частный статический конечный длинный serialVersionUID = 1L; \t @Id \t @GeneratedValue (стратегия = GenerationType.IDENTITY) \t @column (имя = "ADDRESS_ID") \t частная Long рк; \t @Column (name = "address_name", nullable = false, length = 255) \t private String addressName; } ' – Bukhtawar

Смежные вопросы