JPA中实现单向一对多的关联关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JPA中实现单向一对多的关联关系相关的知识,希望对你有一定的参考价值。


场景


在上面搭建好JPA的HelloWorld程序后,以及实现单向多对一的关联关系后。

单向多对一是在Order层添加Customer信息,即在Order实体类中添加

private Customer customer;

这样多个Order订单类就能映射到同一个用户,实现单向多对一。

如果要实现单向一对多的映射关系,就要在Customer层中添加Order的集合,进而实现单向一对多的映射。

注:

关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

将之前Order中Customer属性注释掉

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;
*/

然后来到Customer类中添加Order的集合

private Set<Order> orders = new HashSet<>();

以及相应的set和get方法

public Set<Order> getOrders() 
return orders;


public void setOrders(Set<Order> orders)
this.orders = orders;

然后在get方法中添加注解

@JoinColumn(name="CUSTOMER_ID")
@OneToMany
public Set<Order> getOrders()
return orders;

public void setOrders(Set<Order> orders)
this.orders = orders;

注:

使用 @OneToMany 来映射 1-n 的关联关系

使用 @JoinColumn 来映射外键列的名称

编写单元测试类进行测试

@Test
public void testOneToManyPersist()
Customer customer = new Customer();
customer.setAge(18);

customer.setEmail("mm@163.com");
customer.setLastName("MM");

Order order1 = new Order();
order1.setOrderName("O-MM-1");

Order order2 = new Order();
order2.setOrderName("O-MM-2");

//建立关联关系
customer.getOrders().add(order1);
customer.getOrders().add(order2);


//执行保存操作
entityManager.persist(customer);

entityManager.persist(order1);
entityManager.persist(order2);

运行单元测试类效果

数据库中订单表

JPA中实现单向一对多的关联关系_JPA

 

数据库中用户表

JPA中实现单向一对多的关联关系_Customer_02

 

测试一对多Find方法

编写单元测试方法

@Test
public void testOneToManyFind()
Customer customer = entityManager.find(Customer.class, 6);
System.out.println(customer.getLastName());

System.out.println(customer.getOrders().size());

运行效果

JPA中实现单向一对多的关联关系_JPA_03

 

注:

默认对关联的多的一方使用懒加载的加载策略。

可以使用 @OneToMany 的 fetch 属性来修改默认的加载策略

比如:@OneToMany(fetch=FetchType.LAZY)

测试一对多删除方法

新建单元测试方法

@Test
public void testOneToManyRemove()
Customer customer = entityManager.find(Customer.class, 8);
entityManager.remove(customer);

注:

默认情况下, 若删除 1 的一端, 则会先把关联的 n 的一端的外键置空,然后进行删除。

可以通过 @OneToMany 的 cascade属性来修改默认的删除策略。

比如:@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.REMOVE)

测试一对多更新方法

新建单元测试方法

@Test
public void testUpdate()
Customer customer = entityManager.find(Customer.class, 6);

customer.getOrders().iterator().next().setOrderName("O-XXX-10");

 

以上是关于JPA中实现单向一对多的关联关系的主要内容,如果未能解决你的问题,请参考以下文章

JPA中实现双向一对一的关联关系

JPA一对多单向

Spring Data JPA中的mappedBy

Hibernate框架学习之注解配置关系映射

关于JPA一对一,一对多(多对一),多对多的详解

Jpa之关联对象(单向多对多)