1. 程式人生 > >hibernate的多對多(一)

hibernate的多對多(一)

1.herbernate一對多自關聯 樹形選單查詢可能出現的問題

 當載入一級節點的時候沒問題(強制載入);
        載入二級載入時候,由於設定了強制載入,同樣可以加載出所有的二級節點。沒問題;
        載入三級節點時,這是session關閉了,並且預設採用的是懶載入

	 *  許可權選單載入有兩種方式
	 * (1)、一次性將資料庫表中的資料全部載入往瀏覽器返回(適用於選單較少)
	 * (2)、選單表資料量較大,當出現瀏覽器卡頓的情況,第一種情況就不適用了
	 *   那麼就採用選單逐級載入。

2.多對多級聯查詢 書籍表、書籍類別表: ①:以前我們要查詢多個表的關係需要用到多表聯查: select * from Book b,Book_category bc, category where b.bid=bc.bid and bc.bic=c.cid and bid = 2 ②:在hibernate中,你只管查詢當前表物件即可, hibernate會自動關聯橋表以及關聯表查詢出關聯物件

配置檔案:

<!---
table:橋接表
-->
1.book.hbm.xml
<set table="t_hibernate_book_category"   name="category"  cascade="save-update" inverse="false">
<!--one--->
      <key  column="bid"></key>
      <!--many--->
      <many-to-many  column="cid"  class="com.zking.five.entity.Category"> 
      </many-to-many>
</set>
2.category.hbm.xml
<set table="t_hibernate_book_category" name="books" cascade="save-update" inverse="true">
        <key  column="cid"></key>
        <many-to-many  column="bid"  class="com.zking.five.entity.Book"></many-to-many>
</set>

sql的形成過程分析: 首先根據 session.get(Book.class,5) 這個方法 得到 sql=select * from t_hibernate_book where bookId=?(5) 得到結果集 resultSet—>拿到book類的例項 Book book= Class.forName(“com.zking,five.entity.Book”);//沒值的 因為配置檔案中封裝了一些book屬性,所以我們可以拿到一個Filed(配置檔案)屬性 ------------>根據xml建模等操作 然後將book類的屬性一個個賦值進去 book.setBookId(5); book.setBookName(a); book.setPrice(10) 這些都是通過反射去做的

categories為什麼有值? ①建模之後通過當前實體類的對映檔案找到set標籤中的table屬性 select * from t_hibernate_book_category ②繼續讀取配置檔案,拿到set標籤中的子標籤key的column屬性(當前類對應的表主鍵在) select cid from t_hibernate_book_category where bid = ?(bookId=5) 執行了這條sql語句又形成了一個 resultSet---->cid ③set標籤—>many-to-class com.zking.five.entity.Category category.hbm.xml select * from t_hibernate_category ④利用橋接表查詢出來的資料查詢關聯表 where categry_id in (cid); cid cname ⑤EntityBaseDao中的executeQuery方法,對result進行處理, 最終返回 list categories = new AttrayList(); while(rs.next){ Categry c = Class.forName(“com.zking,five.entity.Book”); c.set… category.add©; } ⑥book.setCategoies(categgories);