1

我有下面的映射

<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”时,执行上述命名查询时。它返回一个用户对象,其属性地址设置为“美国”,但 id 为空。

为什么复合 id 为空?

注意:理想情况下,我应该在 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();
4

1 回答 1

1

您确实需要在 UserPK 类中实现 hashCode/equals。

hibernate 文档非常明确,您必须为复合键类实现 equals() 和 hashCode()。这些方法用于缓存查找。如果您不这样做,文档没有具体说明软件将如何失败,但是休眠无法从缓存中检索 id 对象并将您的值保留为 null 似乎是一种可能的失败情况。

于 2013-06-25T18:27:42.370 回答