个人总结
需要用到@manytomany注解,然后在需要维护关系的一方,加上@joinTable注解。
必须指定一个维护关系,否则会导致关系表id重复出现错误。
@joinTable 有以下属性,joinColumns ,设定该实体类映射在关系表中的外键列名和参照列,inverseColumns ,设定和该实体类关联的实体,在关系表中的外键列名和参照列。name指定表名
在不维护关系的一端,还需要设置mappedBy
同样,由于关系表的存在,所以无论是维护关系的一方还是不维护关系的一方,都默认采用延迟加载策略。
双向多对多关联关系
在双向多对多关系中,我们必须指定一个关系维护端(owner side),可以通过 @ManyToMany 注释中指定 mappedBy 属性来标识其为关系维护端。
@ManyToMany
@JoinTable(name="中间表名称",
joinColumns=@joinColumn(name="本类的外键",
referencedColumnName="本类与外键对应的主键"),
inversejoinColumns=@JoinColumn(name="对方类的外键",
referencedColunName="对方类与外键对应的主键")
)
@ManyToMany(mappedBy="categories")
public Set<Item> getItems() {
return items;
}
@JoinTable(name="relationTable",
joinColumns={@JoinColumn(name="ITEM_ID",referencedColumnName="ID")},
inverseJoinColumns={@JoinColumn(name="CATEGORY_ID",referencedColumnName="ID")}
)
@ManyToMany
public Set<Category> getCategories() {
return categories;
}
@Test
public void testMany(){
Category category=new Category();
category.setCategory_name("水果");
Category category2=new Category();
category2.setCategory_name("食物");
Item item1= new Item();
Item item2= new Item();
item1.setItemName("苹果");
item2.setItemName("香蕉");
//设定关系
category.getItems().add(item1);
category.getItems().add(item2);
category2.getItems().add(item1);
category2.getItems().add(item2);
item1.getCategories().add(category);
item1.getCategories().add(category2);
item2.getCategories().add(category);
item2.getCategories().add(category2);
entityManager.persist(item2);
entityManager.persist(item1);
entityManager.persist(category);
entityManager.persist(category2);
}