Đâ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
, Product
và Address
.
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ể, Order
và Product
, 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 Order
và Product
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ớiProductOrder
. -
ProductOrder
có mối quan hệ nhiều-một vớiOrder
. -
Product
có mối quan hệ một-nhiều vớiProductOrder
. -
ProductOrder
có mối quan hệ nhiều-một vớiProduct
.
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)