我有下面的地图
<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
}在我的DB中,我有结构如下的用户表
_______________________________________________________________________________
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没有任何关系。
有人能帮助我失去的东西吗?
编辑:
Query findTransQuery = HibernateHelper.currentSession().getNamedQuery("findUserDetails");
findTransQuery.setParameter("userId", "E101");
findTransQuery.setParameter("emailId", "abc@yahoo.com");
List<User> users= findTransQuery.list();发布于 2013-06-25 18:27:42
您确实需要在UserPK类中实现hashCode/equals。
hibernate文档非常明确,您必须为复合键类实现相等()和hashCode()。这些方法用于缓存查找。如果您不这样做,文档并没有确切地指定软件将如何失败,但是hibernate无法从缓存中检索id对象并使您的值为空,这似乎是一个可能的失败场景。
https://stackoverflow.com/questions/17304394
复制相似问题