zoukankan      html  css  js  c++  java
  • JPA中实现双向多对多的关联关系(附代码下载)

    场景

    JPA入门简介与搭建HelloWorld(附代码下载):

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

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

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

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

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103520083

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

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103523564

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

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103530292

    按照上面的流程实现以上映射关系后,怎样在JPA中实现双向多对多的映射关系。

    比如说商品与分类就是双向多对多的关系。

    一个商品可以有多个分类,一个分类可以有多个商品。

    在双向多对多关系中,我们必须指定一个关系维护端(owner side),可以通过 @ManyToMany 注释中指定 mappedBy 属性来标识其为关系维护端。

    注:

    博客主页:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    首先连接数据库,为了构建出双向多对多的关系,我们需要新建三个表,商品表、分类表、映射关系表。

    新建商品表JPA_ITEMS

    其中id为自增非空主键

    然后新建类别表JPA_CATERORIES

    其中id为自增非空主键

    然后再新建关联表ITEM_CATEGORY

    不要添加主键。

    然后打开Eclise中上面一直使用的JPA的项目,在包下新建实体类,这里选择使用ITEM作为双向关系维护的一方。

    新建Item实体类

    package com.badao.jpa.helloworld;
    
    import java.util.HashSet;
    import java.util.Set;
    
    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.JoinTable;
    import javax.persistence.ManyToMany;
    import javax.persistence.Table;
    
    @Table(name="JPA_ITEMS")
    @Entity
    public class Item {
    
     private Integer id;
     private String itemName;
     
     private Set<Category> categories = new HashSet<>();
    
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Id
     public Integer getId() {
      return id;
     }
    
     public void setId(Integer id) {
      this.id = id;
     }
    
     @Column(name="ITEM_NAME")
     public String getItemName() {
      return itemName;
     }
    
     public void setItemName(String itemName) {
      this.itemName = itemName;
     }
    
     //使用 @ManyToMany 注解来映射多对多关联关系
     //使用 @JoinTable 来映射中间表
     //1. name 指向中间表的名字
     //2. joinColumns 映射当前类所在的表在中间表中的外键
     //2.1 name 指定外键列的列名
     //2.2 referencedColumnName 指定外键列关联当前表的哪一列
     //3. inverseJoinColumns 映射关联的类所在中间表的外键
     @JoinTable(name="ITEM_CATEGORY",
       joinColumns={@JoinColumn(name="ITEM_ID", referencedColumnName="ID")},
       inverseJoinColumns={@JoinColumn(name="CATEGORY_ID", referencedColumnName="ID")})
     @ManyToMany
     public Set<Category> getCategories() {
      return categories;
     }
    
     public void setCategories(Set<Category> categories) {
      this.categories = categories;
     }
    }

    注:

    在上面注释中已经说明怎样维护关联关系。

    然后再新建类别实体类Category

    package com.badao.jpa.helloworld;
    
    import java.util.HashSet;
    import java.util.Set;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.ManyToMany;
    import javax.persistence.Table;
    
    @Table(name="JPA_CATEGORIES")
    @Entity
    public class Category {
    
     private Integer id;
     private String categoryName;
     
     private Set<Item> items = new HashSet<>();
    
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Id
     public Integer getId() {
      return id;
     }
    
     public void setId(Integer id) {
      this.id = id;
     }
    
     @Column(name="CATEGORY_NAME")
     public String getCategoryName() {
      return categoryName;
     }
    
     public void setCategoryName(String categoryName) {
      this.categoryName = categoryName;
     }
    
     @ManyToMany(mappedBy="categories")
     public Set<Item> getItems() {
      return items;
     }
    
     public void setItems(Set<Item> items) {
      this.items = items;
     }
    }

    在这方主要是通过  @ManyToMany(mappedBy="categories")来指明关系,其中categories要与item中的属性名相对应。

    然后打开persistense.xml配置文件,将此两个实体类进行添加

      <class>com.badao.jpa.helloworld.Item</class>
      <class>com.badao.jpa.helloworld.Category</class>

    添加位置如下


      打开单元测试类,编写单元测试方法

     //多对所的保存
      @Test
      public void testManyToManyPersist(){
       Item i1 = new Item();
       i1.setItemName("i-1");
      
       Item i2 = new Item();
       i2.setItemName("i-2");
       
       Category c1 = new Category();
       c1.setCategoryName("C-1");
       
       Category c2 = new Category();
       c2.setCategoryName("C-2");
       
       //设置关联关系
       i1.getCategories().add(c1);
       i1.getCategories().add(c2);
       
       i2.getCategories().add(c1);
       i2.getCategories().add(c2);
       
       c1.getItems().add(i1);
       c1.getItems().add(i2);
       
       c2.getItems().add(i1);
       c2.getItems().add(i2);
       
       //执行保存
       entityManager.persist(i1);
       entityManager.persist(i2);
       entityManager.persist(c1);
       entityManager.persist(c2);
      }

    运行单元测试,查看商品表

    查看类别表

    查看关联表

    上面是测试的保存方法,再新建测试方法测试查询

      //对于关联的集合对象, 默认使用懒加载的策略.
      //使用维护关联关系的一方获取, 还是使用不维护关联关系的一方获取, SQL 语句相同. 
      @Test
      public void testManyToManyFind(){
       Item item = entityManager.find(Item.class, 5);
       System.out.println(item.getItemName());
       System.out.println(item.getCategories().size());
      }

    查询效果

     

    示例代码下载

    https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12054302

  • 相关阅读:
    PLECS—晶闸管-第九周
    第五六周读书笔记
    PLEC-交流电机系统+笔记
    直流电机交流电机读书笔记-4
    PLECS—直流电机系统2
    自动化技术中的进给电气传动-读书笔记3
    文档保存
    TensorFlow安装教程(CPU版)
    团队项目开发日志--(第四篇)
    团队项目开发日志--(第三篇)
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/12102247.html
Copyright © 2011-2022 走看看