jpa--13雙向多多

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

發佈了456 篇原創文章 · 獲贊 27 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章