首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Hibernate中将复合Id获取为null

在Hibernate中将复合Id获取为null
EN

Stack Overflow用户
提问于 2013-06-25 18:03:00
回答 1查看 689关注 0票数 1

我有下面的地图

代码语言:javascript
复制
<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类

代码语言:javascript
复制
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
  }

在我的DB中,我有结构如下的用户表

代码语言:javascript
复制
_______________________________________________________________________________
User_id      email_id                   address
E101          abc@yahoo.com             America 
E102          xyz@yahoo.com             UK
_______________________________________________________________________________

当我将userId设置为'E101‘,将emailId设置为'abc@yahoo.com’时,我在下面执行上述命名查询时。它返回一个用户对象,其属性地址设置为'America‘,而id设置为null。

为什么复合id以null的形式出现?

注意:理想情况下,我应该在UserPk类中实现equals和hashcode,但只是省略了它,因为我猜它与组合id作为null没有任何关系。

有人能帮助我失去的东西吗?

编辑:

代码语言:javascript
复制
Query findTransQuery = HibernateHelper.currentSession().getNamedQuery("findUserDetails");
        findTransQuery.setParameter("userId", "E101");
        findTransQuery.setParameter("emailId", "abc@yahoo.com");

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

回答 1

Stack Overflow用户

发布于 2013-06-25 18:27:42

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

hibernate文档非常明确,您必须为复合键类实现相等()和hashCode()。这些方法用于缓存查找。如果您不这样做,文档并没有确切地指定软件将如何失败,但是hibernate无法从缓存中检索id对象并使您的值为空,这似乎是一个可能的失败场景。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17304394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档