2010-03-10 106 views
3

我有一個主表是USER的結構,其他表包括CATEGORY(包含user_id)。休眠逆向工程

我得到了什麼後,在標準的逆向工程方法是:

  • 類用戶包含一個類的集合,
  • 類類別不包含外鍵(user_ID的),但它確實包含用戶對象。

爲什麼它不包含作爲類屬性的外鍵?

我該如何在HQL中連接這兩個表而沒有粘連? HQL - 請解釋這部分。

回答

3

爲什麼它不包含作爲類屬性的外鍵?

因爲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 
3

在這種情況下,Hibernate會自動爲您處理外鍵。在Java方面,你不需要考慮外鍵,而是聚合。這就是爲什麼Category包含(參照a)User對象,而不是FK。在Hibernate映射中指定了Categoryuser屬性與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

+0

我明白了。對我來說,擁有User對象和外鍵都是很自然的。讓我們看看別人會回覆什麼。謝謝。 – EugeneP 2010-03-10 12:34:04

+0

@EugeneP看到我的更新說明和參考 - 希望它有助於澄清問題。擁有_用戶對象__和Java類中的FK將是重複的,需要更多的同步併爲錯誤開闢更多的可能性。此外,PK和FK(應該)通常是DB專用的(這是Hibernate的建議)。 – 2010-03-10 12:42:12

+0

@EugeneP我添加了一個HQL示例和一個引用。 – 2010-03-10 16:27:48

0

我同意與彼得Török:當前休眠行爲是所預期的。

例如,當您更新修改用戶但不是原始FK的類別時應該休眠的是什麼?

爲什麼你需要生FK?你只需要做category.getUser()。getId();有權訪問它,而不會冒你的Category對象中的狀態不一致的風險。