簡體   English   中英

在Hibernate中將Composite Id獲取為null

[英]Getting Composite Id as null in Hibernate

我有下面的映射

<class name="User" table="user">
   <composite-key class="UserPk">
      <key-property name="userId" column="user_id"/>
      <key-property name="emailId" column="email_id"/>
   </composite-key>
   <property name="address" column="address"/>
</class>
 <query name="findUserDetails">
<![CDATA[
 select u from User u where u.id.userId = :userId and u.id.emailId = :emailId
   ]]>
</query>

Java類

class User implements Serializable{
  private UserPk id;
  private String address;
  //setters and getters
  }
  class UserPk implements Serializable{
  private String userId;
  private String emailId;
   //setters and getters
  }

在我的數據庫中,我的用戶表具有以下結構

_______________________________________________________________________________
User_id      email_id                   address
E101          abc@yahoo.com             America 
E102          xyz@yahoo.com             UK
_______________________________________________________________________________

當我將userId設置為“ E101”並將emailId設置為“ abc@yahoo.com”時,使用以下命令執行上述命名查詢。 它返回給我一個User對象,其屬性地址設置為“ America”,但id為null。

為什么復合ID為null?

注意:理想情況下,我應該在UserPk類中實現equals和hashcode,但只是省略了它,因為我認為它與復合ID為null無關。

誰能幫助我所缺少的嗎?

編輯:

Query findTransQuery = HibernateHelper.currentSession().getNamedQuery("findUserDetails");
        findTransQuery.setParameter("userId", "E101");
        findTransQuery.setParameter("emailId", "abc@yahoo.com");

        List<User> users= findTransQuery.list();

您確實需要在UserPK類中實現hashCode / equals。

休眠文檔非常明確,您必須為復合鍵類實現equals()和hashCode()。 這些方法用於緩存查找。 文檔沒有明確指定如果不這樣做,軟件將如何失敗,但是休眠狀態無法從緩存中檢索id對象並將值保留為null似乎是一種可能的失敗情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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