2014-11-25 90 views
0

我有兩個表,例如用戶和角色。 (一個用戶可以包含很多角色)選擇查詢時休眠 - 外鍵對象爲空

我使用SQL查詢將role_id(假設pk爲Role表)的數據插入到User表中作爲外鍵。

現在,當我試圖獲取特定角色的用戶記錄。

我正在使用以下代碼來獲取用戶對象。

User user=(User)session.get('User.class',user_id); 

Role role=user.getRole(); 

在執行上述命令時,有時候我得到的是用戶對象,有些時候沒有。 對象之間的關係映射如下。

<many-to-one name="role" class="com.example.Role" fetch="select"> 

     <column name="role_id" precision="14" scale="0" /> 

    </many-to-one> 

<set name="user" cascade="delete" table="User" > 
     <key> 
      <column name="role_id" not-null="true" /> 
     </key> 
     <one-to-many class="com.example.User" /> 
</set> 

有什麼辦法可以防止它發生嗎? 這是可能的,有些時候,選擇查詢會給我輸出,有時爲空。

回答

0

在您的設計中似乎存在根本性錯誤。您聲明一個用戶可以包含多個角色。這意味着外鍵(指向用戶的PK)應該在角色中。但是您似乎已將外鍵放在用戶中。

+0

對不起錯誤的描述。但是表格之間的關係在技術上是正確的。 – 2014-11-26 06:02:00

0

除了DUKE答案誰明確指出,你的映射說,一個角色擁有衆多用戶,而不是你的要求,還存在着一些問題與您的代碼:您需要添加逆=「真」

第一到你的一對多的一面。既然你有一個雙向關聯,只有一方可以將自己的關係:

<set name="user" cascade="delete" table="User" inverse="true"> 
     <key> 
       <column name="role_id" not-null="true" /> 
     </key> 
     <one-to-many class="com.example.User" /> 
    </set> 

然後它會更有效率,來獲取與用戶在同一個查詢中的作用:

User user = (User) 
     session.createQuery(
      "select u from User left join fetch u.role where u.id = :user_id') 
     .setParameter("user_id", user_id) 
     .uniqueResult(); 
+0

謝謝你的commnet。我會嘗試使用inverse =「true」選項。 – 2014-11-26 06:02:48