1 雙向一一
1.1 概念
在雙向多對多關係中,我們必須指定一個關係維護端(owner side),可以通過 @ManyToMany 註釋中指定 mappedBy 屬性來標識其爲關係維護端。
1.2 配置(建議單向維護)
1.3 數據生成信息
1.4 測試準備
1.4.1 Item
@Table(name="JPA_ITEMS")
@Entity
public classItem {
private Integer id;
private String itemName;
private Set<Category> categories = new HashSet<>();
@GeneratedValue
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="ITEM_NAME")
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
//使用 @ManyToMany 註解來映射多對多關聯關係
//使用 @JoinTable 來映射中間表
//1. name 指向中間表的名字
//2. joinColumns 映射當前類所在的表在中間表中的外鍵
// 2.1 name 指定外鍵列的列名
// 2.2referencedColumnName 指定外鍵列關聯當前表的哪一列
//3. inverseJoinColumns 映射關聯的類所在中間表的外鍵
@JoinTable(name="ITEM_CATEGORY",
joinColumns={@JoinColumn(name="ITEM_ID",referencedColumnName="ID")},
inverseJoinColumns={@JoinColumn(name="CATEGORY_ID",referencedColumnName="ID")})
@ManyToMany
public Set<Category>getCategories() {
return categories;
}
public voidsetCategories(Set<Category> categories) {
this.categories = categories;
}
}
1.4.2 Category
@Table(name="JPA_CATEGORIES")
@Entity
public classCategory {
private Integer id;
private String categoryName;
private Set<Item> items = new HashSet<>();
@GeneratedValue
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="CATEGORY_NAME")
public StringgetCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
@ManyToMany(mappedBy="categories")
public Set<Item>getItems() {
return items;
}
public voidsetItems(Set<Item> items) {
this.items = items;
}
}
1.4.3 準備JPATestManyMany
public classJPATestManyMany{
private EntityManagerFactory entityManagerFactory;
private EntityManager entityManager;
private EntityTransaction transaction;
@Before
public void init(){
entityManagerFactory= Persistence.createEntityManagerFactory("jpa_test1");
entityManager = entityManagerFactory.createEntityManager();
transaction = entityManager.getTransaction();
transaction.begin();
}
@After
public void destroy(){
transaction.commit();
entityManager.close();
entityManagerFactory.close();
}
}
2 操作
2.1 保存(雙向維護)
//多對所的保存
@Test
public void testManyToManyPersist(){
Itemi1 = new Item();
i1.setItemName("i-1");
Itemi2 = new Item();
i2.setItemName("i-2");
Categoryc1 = new Category();
c1.setCategoryName("C-1");
Categoryc2 = 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);
}
2.2 查詢(oid)
//對於關聯的集合對象, 默認使用懶加載的策略.
//使用維護關聯關係的一方獲取, 還是使用不維護關聯關係的一方獲取, SQL 語句相同.
//對於關聯的集合對象, 默認使用懶加載的策略.
//使用維護關聯關係的一方獲取, 還是使用不維護關聯關係的一方獲取, SQL 語句相同.
@Test
public void testManyToManyFind(){
// Itemitem = entityManager.find(Item.class, 5);
// System.out.println(item.getItemName());
//
// System.out.println(item.getCategories().size());
Categorycategory= entityManager.find(Category.class, 3);
System.out.println(category.getCategoryName());
System.out.println(category.getItems().size());
}
2.3 刪除(一方)
2.3.1 外鍵置空,只刪一方
2.3.2 外鍵置空,都刪
2.4 更新
源碼文件:https://download.csdn.net/download/qq_26553781/10320668