我有一個主表是USER的結構,其他表包括CATEGORY(包含user_id)。休眠逆向工程
我得到了什麼後,在標準的逆向工程方法是:
- 類用戶包含一個類的集合,
- 類類別不包含外鍵(user_ID的),但它確實包含用戶對象。
爲什麼它不包含作爲類屬性的外鍵?
我該如何在HQL中連接這兩個表而沒有粘連? HQL - 請解釋這部分。
我有一個主表是USER的結構,其他表包括CATEGORY(包含user_id)。休眠逆向工程
我得到了什麼後,在標準的逆向工程方法是:
爲什麼它不包含作爲類屬性的外鍵?
我該如何在HQL中連接這兩個表而沒有粘連? HQL - 請解釋這部分。
爲什麼它不包含作爲類屬性的外鍵?
因爲Hibernate是一個對象 - 關係映射工具,休眠允許與對象模型的工作(即對象和對象之間的關係),並將它們映射到數據庫中表示(表的數據的行)。 Hibernate的重點在於彌合面向對象範式和關係範式(着名的Object-Relational Impedance Mismatch)之間的差距。對你來說,這下面的對象模型的預期(右)對象表示:
alt text http://img251.imageshack.us/img251/6335/110b578b.png
我如何加入HQL這兩個表沒有這種膠水?
膠水是那裏,但你必須考慮對象(和關聯)。例如(見14.3. Associations and joins):
from Category as category join category.user as user
注意HQL支持兩種形式的聯合加盟:隱和明確(見14.4. Forms of join syntax)。上面的示例使用明確的連接。該隱含形式不使用join關鍵字,但在點格式:
from Category category where category.user.id =: id
在這種情況下,Hibernate會自動爲您處理外鍵。在Java方面,你不需要考慮外鍵,而是聚合。這就是爲什麼Category
包含(參照a)User
對象,而不是FK。在Hibernate映射中指定了Category
的user
屬性與USER
表中的FK列之間的綁定。
如果使用這些類創建Criteria或Query,Hibernate會自動使用適當的FK生成SQL查詢。我沒有使用HQL的經驗,但我非常肯定Hibernate也能正確處理它。
更新: HQL例如:
from Category as category inner join fetch category.user as user
實施例改編自here。
有關映射的更多詳細信息,請參閱Hibernate Reference, chapters 5至7
我同意與彼得Török:當前休眠行爲是所預期的。
例如,當您更新修改用戶但不是原始FK的類別時應該休眠的是什麼?
爲什麼你需要生FK?你只需要做category.getUser()。getId();有權訪問它,而不會冒你的Category對象中的狀態不一致的風險。
我明白了。對我來說,擁有User對象和外鍵都是很自然的。讓我們看看別人會回覆什麼。謝謝。 – EugeneP 2010-03-10 12:34:04
@EugeneP看到我的更新說明和參考 - 希望它有助於澄清問題。擁有_用戶對象__和Java類中的FK將是重複的,需要更多的同步併爲錯誤開闢更多的可能性。此外,PK和FK(應該)通常是DB專用的(這是Hibernate的建議)。 – 2010-03-10 12:42:12
@EugeneP我添加了一個HQL示例和一個引用。 – 2010-03-10 16:27:48