我有一个表Orders,其中包含Products的列表。对于每个与特定订单相对应的产品,我需要存储一个地址列表,其中单个产品(每个产品的订单)应该交付到
+----------------+------------+
| Order_ID | Product_ID |
+----------------+------------+
| 1 | 1000 |
| 2 | 1000 |
| 2 | 1001 |
+----------------+------------+因此,我有这个表,它对许多人来说是关于、Orders、和Products的,我需要的是将上表中的每个条目映射到Addresses列表中。所以我需要这样的东西
|PK|Order_ID |Product_ID |
| 1| 1 | 1000 |
| 2| 2 | 1000 |
| 3| 2 | 1001 | 要将上表中的一个条目映射到地址列表,我需要更多的地址到上面PK和地址ID的多个表(我的地址表的主键)。
|PK_Order_Product |Address_ID|
| 1 | 1 |
| 2 | 1 |
| 2 | 3 |这里,PK_Order_Product是上一个表的主键(PK)上的外键,我使用JPA来持久化我的MYSQL -如果我的设计是用correct.How使用JPA注释来实现这一点,请帮助我编写一个代码片段
发布于 2015-10-17 19:39:42
这其实是一个值得研究和试验的好问题。有许多方法来进行映射。想出一个更好的设计实际上取决于您的应用程序需求。但我认为这将是实现映射的一种有效方法:
我将为Order、Product和Address创建3个独立的实体。
我们将不会实现两个实体( Order和Product )之间通常的多对多关系,在这两个实体中,每一方都有另一方的集合。相反,我将创建另一个实体来表示Order和Product之间的关系,让我们将其命名为ProductOrder。下面是他们之间关系的映射方式:
Order与ProductOrder有一对多的关系.ProductOrder与Order有着多对一的关系.Product与ProductOrder有一对多的关系.ProductOrder与Product有着多对一的关系.ProductOrder的主键将由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
@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")},
inverseJoinColumns=@JoinColumn(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)https://stackoverflow.com/questions/33181733
复制相似问题