Hibernate: Cannot fetch data back to Maplt;gt;(休眠:无法将数据回取到Maplt;gt;)
问题描述
拥有这些实体:
User.java:
Friendship.java:
Friendship Id.Java:
UserRepository.Java:
和最终DemoApplication.java:
userRepo.save(u1)
操作后,各表如下:
如您所见,所有朋友都已保存。然而,这一声明:
返回null
。即使fetchedUser
已获取朋友图:
打印:
那么,当Mapfriendships
被完全获取(从上面的语句中可以看到,所有的朋友都被获取了)时,为什么无法获取朋友f1
(更准确地说是null
)?
PS:
我已经删除了@Data
Lombok批注(刚刚添加了@Getter
、@Setter
和@NoArgsConstructor`),并亲自重写了equalsAndHashCode:
或者换句话说,equals()
方法使用User
类的所有字段。
推荐答案
问题是,当如您所见,所有朋友都已保存。然而,这一声明:
即使fetchedUser拥有好友地图 已提取:打印:
f1
User
添加到friendships
HashMap时,主键id
不存在。它稍后会在某个时候通过Hibernate进行更新。这会更改HashCode值!
hashcode
键的值在添加到Map
后不应更改。这就是导致问题的原因。模拟问题的简单测试代码-https://www.jdoodle.com/a/3Bg3
解决方案
将用户添加到映射后,不应更改hashcode
值。我认为有几个选择可以尝试解决这个问题-- 在将数据库中的好友放入
friendship
地图之前将其持久化。因此该ID已分配。 - 根本不要覆盖
equals
和hashcode
。使用默认设置。基于对象标识。 - 使用固定的哈希码。例如,如果
username
分配后没有变化,则该字段可用于生成hashcode
值。
这篇关于休眠:无法将数据回取到Map<;>;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!