簡體   English   中英

春季休眠映射問題

[英]Spring-hibernate mapping problem

我有一個Spring-Hibernate應用程序,無法正確映射對象:基本上我有2個域對象, PostUser 語義是每個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 ...

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

有任何想法嗎? 謝謝!

更新 :由於下面的幾篇文章,我現在意識到我應該使用多對一映射而不是一對一。 我將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM