繁体   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