一、单向多对一
保存单向多对一时候,建议先保存一的一方,后保存n的一方,这样不会多出额外的update语句。
默认情况下使用左外连接的方法是获取n的一端对象和其关联的1的一端对象,可以使用@ManyToOne的fetch属性来改变默认的关联加载策略。
不能直接删除1的一方,因为有外键关联约束
修改可以
总结:
外键是在建立在哪一方---》
首先,外键引用的那个列在主表中必须是主键列或者唯一列。
所以1:n的肯定把外键建立在n的那张表上。
1:1,一般要看谁是主表,谁是附属表,外键当然建立在附属表中。
n:m的情况,需要建立一个关系表,
两个原表和其关系分别是1:n,1 :m
关系维护在多的一方,多的一方Order中设置Customer的属性,并且通过注解(使用@ManyToOne来映射多对一的关联关系
//使用@JoinColumn来映射外键)。一的一方Customer不做任何处理。
多的一方:
@Table(name="JPA_ORDER")
@Entity
public class Order {
@Id
@GeneratedValue
private Integer id;
@Column(name="ORDER_NAME")
private String orderName;
//使用@ManyToOne来映射多对一的关联关系
//使用@JoinColumn来映射外键
@JoinColumn(name="CUSTOMER_ID")
@ManyToOne
private Customer customer;
一的一方:
@Table(name="JPA_CUSTOMER")
@Entity
public class Customer {
@Id
@GeneratedValue
private Integer id;
@Column(name = "LAST_NAME")
private String lastName;
@Column(name="EMAIL")
private String email;
@Column(name="age")
private Integer age;
@DateTimeFormat
@Column(name = "CREATE_TIME")
private Date createTime;
@DateTimeFormat
@Column(name="BIRTH")
private Date birth;
测试:增删改查
新增//
Customer customer = new Customer();
customer.setAge(18);
customer.setBirth(new Date());
customer.setCreateTime(new Date());
cutomer.setLastName("AA");
Order order1 = new Order();
order1.setOrderName("O-FF-1");
Order order2 = new Order();
order2.setOrderName("O-FF-2");
设置关联关系
order1.setCustomer(customer);
order2.setCustomer(customer);
//执行保存操作
entityManager.persist(customer);
entityManager.persist(order1);
entityManager.persist(order2);
***************************************************
查询
Order order = entityManager.find(Order.class,2);
System.out.println(order.getOrderName());
System.out.println(order.getCustomer().getLastName());
**************************************************
更新
Order order = entityManager.find(Order.class,2);
order.getCustomer().setLastName("FFF");
*************************************************
删除
错误演示,不可以删除一的一方,因为有外键约束
Order order = entityManager.find(Order.class,1);
entityManager.remove(order);