2010-03-24 144 views
2

我有一個spring-hibernate應用程序,它無法正確映射對象:基本上我有2個域對象,PostUser。語義是每個帖子都有一個相應的用戶。Spring-hibernate映射問題

Post域對象看起來大致如下:

class Post { 

    private int pId; 
    private String attribute; 
    ... 
    private User user; 

    //getters and setters here 

} 

正如你所看到的,Post包含User參考。當我加載一個Post對象時,我想要對應User對象加載(懶惰 - 只在需要時)。

我的映射如下所示:

<class name="com...Post" table="post"> 
    <id name="pId" column="PostId" /> 
    <property name="attribute" column="Attribute" type="java.lang.String" /> 

    <one-to-one name="User" fetch="join" 
     class="com...User"></one-to-one> 
</class> 

當然,我有User基本映射設置。

就我的表模式而言,我有一個表post與外國UserId鏈接到user表。

我覺得這個設置應該工作,但是當我加載迫使User對象的延遲加載頁面時,我注意到正在生成以下Hiberate查詢:

Select ... from post this_ left outer join user user2_ on this.PostId=user2_.UserId ... 

這顯然是錯誤的:它應該加入UserIdpostUserIduser,但它不正確地加入PostIdpost(其主鍵)UserIduser

任何想法?謝謝!

更新: 由於一對夫婦的帖子下面我現在意識到,我應該一直在使用一個多到一的映射,而不是一比一的。我改變了映射post下以下幾點:

<many-to-one name="User" class="com...User" column="uId"/> 

但現在我得到一個運行時錯誤告訴我,有沒有叫uId屬性。這是有道理的,因爲我的post域對象中沒有uId列(我只是引用了user對象)。現在我對我如何讓Hibernate意識到它需要將帖子表中的外鍵映射到用戶表格感到困惑。應該明確地將uId屬性添加到我的post域對象中作爲佔位符的外鍵?

我希望我做的意義......

回答

1

因爲用戶有很多帖子,你的協會其實是一個「多到一」,而不是「一比一」。它應該工作,如果你相應地映射它。

編輯:是的,你可以在帖子的財產Post.user用「多對一」,或者設定User.posts在用戶與「一個一對多」映射,或都。你是否指定了外鍵列的名稱?在Hibernate中,數據庫中的「列」被映射到Java類中的「屬性」。也就是說,column屬性包含數據庫中外鍵列的名稱,而不是Java類中任何屬性的名稱。如果我正確地閱讀你的問題,你應該使用「UserId」,而不是「uId」。

哦,並且fetch =「join」不能懶惰,因​​爲它強制用戶在與帖子相同的查詢中獲取。

+0

謝謝,但將此映射放置在「後」映射中是否正確?我試着用類似的不正確結果。我不知道如何讓它在Post表中加入UserId,因爲我的域對象沒有任何外鍵的概念,只是對用戶對象的引用。 – James 2010-03-25 00:06:49

+0

感謝您的更新,請您詳細說明「您是否指定了外鍵列的名稱?」,因爲我懷疑這可能是我的問題? – James 2010-03-25 00:19:11

+0

謝謝!!!我浪費了這麼多時間...因爲你可能猜到我是冬眠的新手...... – James 2010-03-25 00:27:01

0

這就是一對一映射的行爲。他們通常共享一個主鍵。 Hibernate假設post的主鍵與用戶的主鍵相同。 This page總結了這種行爲。

我懷疑一個用戶實際上可以有多個帖子。這使您的映射成爲一對多。

+0

對於有超過1篇文章的用戶,你是對的。我只是困惑到何處放置此映射:在Post的映射下或在User的映射下? – James 2010-03-25 00:07:51