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());
}

原文地址:https://www.cnblogs.com/jhxxb/p/10366724.html