zoukankan      html  css  js  c++  java
  • JPA-映射-(@ManyToMany)双向多对多

    Category

    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    
    import javax.persistence.*;
    import java.util.HashSet;
    import java.util.Set;
    
    @Setter
    @Getter
    @ToString
    @Entity
    @Table(name = "ManyToMany_CATEGORIES")
    public class Category {
    
        @Id
        @GeneratedValue
        private Integer id;
    
        @Column(name = "CATEGORY_NAME")
        private String categoryName;
    
        @ManyToMany(mappedBy = "categories")
        private Set<Item> items = new HashSet<>();
    }

    Item

    import lombok.Data;
    
    import javax.persistence.*;
    import java.util.HashSet;
    import java.util.Set;
    
    @Data
    @Entity
    @Table(name = "ManyToMany_ITEMS")
    public class Item {
    
        @Id
        @GeneratedValue
        private Integer id;
    
        @Column(name = "ITEM_NAME")
        private String itemName;
    
        // 使用 @ManyToMany 注解来映射多对多关联关系
        // 使用 @JoinTable 来映射中间表
        // 1. name 中间表的名字
        // 2. joinColumns 映射当前类所在的表在中间表中的外键
        // 2.1 name 指定外键列的列名
        // 2.2 referencedColumnName 指定外键列关联当前表的哪一列
        // 3. inverseJoinColumns 映射关联的类所在中间表的外键
        @JoinTable(name = "ManyToMany_ITEM_CATEGORY",
                joinColumns = {@JoinColumn(name = "ITEM_ID", referencedColumnName = "ID")},
                inverseJoinColumns = {@JoinColumn(name = "CATEGORY_ID", referencedColumnName = "ID")})
        @ManyToMany
        private Set<Category> categories = new HashSet<>();
    }

    测试

    添加

    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;
    
    public class JPAyingshe {
        private EntityManagerFactory entityManagerFactory;
        private EntityManager entityManager;
        private EntityTransaction transaction;
    
        @Before
        public void init() {
            entityManagerFactory = Persistence.createEntityManagerFactory("jpaname");
            entityManager = entityManagerFactory.createEntityManager();
            transaction = entityManager.getTransaction();
            transaction.begin();
        }
    
        @After
        public void destroy() {
            transaction.commit();
            entityManager.close();
            entityManagerFactory.close();
        }
        
        @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, 36);
        System.out.println(item.getItemName());
    
        System.out.println(item.getCategories().size());
    }

    通过另一边查询

    @Test
    public void testManyToManyFind(){
        Category category = entityManager.find(Category.class, 38);
        System.out.println(category.getCategoryName());
        System.out.println(category.getItems().size());
    }

  • 相关阅读:
    2021上半年下午第二题
    21年软件设计师上半年下午试题一
    软考下午第三题-用例图和类图
    类图
    用例图-包含、扩展、泛化
    软考下午题二------数据库设计
    软件设计师下午题-数据流图
    IP练习题
    2020软件工程作业02
    2020软件工程作业01
  • 原文地址:https://www.cnblogs.com/jhxxb/p/10366724.html
Copyright © 2011-2022 走看看