[英]Spring-hibernate mapping problem
我有一個Spring-Hibernate應用程序,無法正確映射對象:基本上我有2個域對象, Post
和User
。 語義是每個Post都有1個對應的User。
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
的表,該表具有鏈接到該user
表的外部UserId
。
我認為這種設置應該可以工作,但是當我加載一個頁面來強制延遲User
對象的加載時,我注意到正在生成以下Hiberate查詢:
Select ... from post this_ left outer join user user2_ on this.PostId=user2_.UserId ...
顯然,這是錯誤的:它應該是加入UserId
從post
與UserId
的user
,而是它的加入不正確PostId
從post
用(其主鍵) UserId
的user
。
有任何想法嗎? 謝謝!
更新 :由於下面的幾篇文章,我現在意識到我應該使用多對一映射而不是一對一。 我將post
下的映射更改為以下內容:
<many-to-one name="User" class="com...User" column="uId"/>
但是現在我遇到了運行時錯誤,告訴我沒有名為uId
屬性。 這是有道理的,因為我在post
域對象中沒有uId
列(我只是對user
對象的引用)。 現在,我對如何讓Hibernate意識到它需要將外鍵從發布表映射到用戶表感到非常困惑。 是否應該在我的post
域對象中顯式添加uId
屬性作為外鍵的占位符 ?
我希望我有道理...
由於用戶有很多帖子,因此您的關聯實際上是“多對一”,而不是“一對一”。 如果您進行相應映射,它應該可以工作。
編輯 :是的,您可以將“ Post.user”上的屬性Post.user映射為“多對一”,或者將User中的User.posts設置為“一對多”,或兩者都映射。 您是否已指定外鍵列的名稱?
Edit2 :用Hibernate的話來說,數據庫中的“列”被映射為Java類中的“屬性”。 也就是說,column屬性包含數據庫中外鍵列的名稱,而不包含Java類中任何屬性的名稱。 如果我沒看錯您的問題,則應使用“ UserId”,而不是“ uId”。
哦,而且fetch =“ join”不能偷懶,因為它要求在與帖子相同的查詢中提取用戶。
這就是一對一映射的行為。 它們通常共享一個主鍵。 Hibernate假定post的主鍵與user的主鍵相同。 此頁面總結了這種行為。
我懷疑一個用戶實際上可以發表多個帖子。 這使您的映射成為一對多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.