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

2022-10-12,

场景

jpa入门简介与搭建helloworld(附代码下载):

https://blog.csdn.net/badao_liumang_qizhi/article/details/103473937

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

https://blog.csdn.net/badao_liumang_qizhi/article/details/103511623

在上面搭建好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);
  }

 

运行单元测试类效果

数据库中订单表

 

 

数据库中用户表

 

 

测试一对多find方法

编写单元测试方法

@test
  public void testonetomanyfind(){
   customer customer = entitymanager.find(customer.class, 6);
   system.out.println(customer.getlastname());
   
   system.out.println(customer.getorders().size());
  }

 

运行效果

注:

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

可以使用 @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中实现单向一对多的关联关系.doc》

下载本文的Word格式文档,以方便收藏与打印。