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);