gpt4 book ai didi

java - 在 Hibernate 中获取 Composite Id 为 null

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:43 24 4
gpt4 key购买 nike

我有以下映射

<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 为空?

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

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

关于java - 在 Hibernate 中获取 Composite Id 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17304394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com