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