JPA学习笔记-映射双向多对多的关联关系

Category类

@Table(name="jpa_categories")
@Entity
public class Category {
	@GeneratedValue
	@Id
	private Integer id;
	@Column(name="category_name")
	private String categoryName;
	
	@ManyToMany(mappedBy="categories")
	private Set<Item> items = new HashSet<>();
	//getter setter
}


Item类

@Table(name="jpa_items")
@Entity
public class Item {

	@GeneratedValue
	@Id
	private Integer id;
	@Column(name="item_name")
	private String itemName;
	//中间表,name为中间表的表名,joinColumns当前类在中间表中的外键(name为外键的列名,referencedColumnName当前表的哪一列),
	//inverseJoinColumns映射关联的类所在中间表的外键
	@JoinTable(name="item_category",
			joinColumns={@JoinColumn(name="item_id", referencedColumnName="id")},
			inverseJoinColumns={@JoinColumn(name="category_id", referencedColumnName="id")})
	@ManyToMany
	private Set<Category> categories = new HashSet<>();
	//getter setter
}


测试保存

		@Test
		public void testManyToManyPersistance() {
			Item item1 = new Item();
			item1.setItemName("item1");
			
			Item item2 = new Item();
			item2.setItemName("item2");
			
			Category category1 = new Category();
			category1.setCategoryName("category1");
			
			Category category2 = new Category();
			category2.setCategoryName("category2");
			
			item1.getCategories().add(category1);
			item1.getCategories().add(category2);
			
			item2.getCategories().add(category1);
			item2.getCategories().add(category2);
			
			category1.getItems().add(item1);
			category1.getItems().add(item2);
			
			category2.getItems().add(item1);
			category2.getItems().add(item2);
			
			entityManager.persist(item1);
			entityManager.persist(item2);
			entityManager.persist(category1);
			entityManager.persist(category2);
		}


保存结果如下图

wKioL1YxjQqyF4MOAAAnPU8I80o489.jpg

wKiom1YxjNXyZAkNAAAcHX6XINg136.jpg

wKioL1YxjQqS3a-zAAAkRCnAqc8534.jpg







测试select

		//默认使用懒加载策略
		//无论先使用维护关联关系的一方获取还是使用不维护关联关系的一方获取,SQL相同
		@Test
		public void testManyToManyFind() {
//			Item item = entityManager.find(Item.class, 1);
//			System.out.println(item.getItemName());
//			System.out.println(item.getCategories().size());
			//上下两种方式SQL语句相同
			Category category = entityManager.find(Category.class, 1);
			System.out.println(category.getCategoryName());
			System.out.println(category.getItems().size());
		}








你可能感兴趣的:(多对多)