场景
JPA入门简介与搭建HelloWorld(附代码下载):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937
在上面博客中搭建好JPA的HelloWorld后,只是对customer实体类完成数据库的映射。
若要实现单向多对一的映射关系,怎样实现。
注:
博客主页:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
数据库中新建JPA_ORDER表
其中一个用户可以有多个订单,但是一个订单只能属于一个用户,所以形成了单向多对一的关系。
订单表中CUSTOMER_ID就是与用户表相关联的外键。
在包下新建实体类Order
package com.badao.jpa.helloworld;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Table(name="JPA_ORDERS")
@Entity
public class Order {
private Integer id;
private String orderName;
private Customer customer;
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="ORDER_NAME")
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
//映射单向 n-1 的关联关系
//使用 @ManyToOne 来映射多对一的关联关系
//使用 @JoinColumn 来映射外键.
//可使用 @ManyToOne 的 fetch 属性来修改默认的关联属性的加载策略
@JoinColumn(name="CUSTOMER_ID")
@ManyToOne
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
}
主要是通过@ManyToOne来映射多对一的关联关系,使用@JoinColumn来映射主键。
然后在配置文件persistence.xml中添加实体类Order的配置
<class>com.badao.jpa.helloworld.Order</class>
添加位置如下
继续上面那篇博客的单元测试类。继续进行编写测试方法
/**
* 保存多对一时, 建议先保存 1 的一端, 后保存 n 的一端, 这样不会多出额外的 UPDATE 语句.
*/
@Test
public void testManyToOnePersist(){
Customer customer = new Customer();
customer.setAge(18);
customer.setEmail("gg@163.com");
customer.setLastName("GG");
Order order1 = new Order();
order1.setOrderName("G-GG-1");
Order order2 = new Order();
order2.setOrderName("G-GG-2");
//设置关联关系
order1.setCustomer(customer);
order2.setCustomer(customer);
//执行保存操作
entityManager.persist(customer);
entityManager.persist(order1);
entityManager.persist(order2);
}
执行成功后查看数据库
用户表
订单表