我在Hibernate中打开两个不同的会话,每个会话都运行各自的事务。每个会话都从表中检索相同的实体。当我打印他们的hashCode()
时,它们是不同的。为什么会这样?如果我们在同一会话中检索到同一实体,则hashCode()
是相同的。这是什么原因造成的?
答案 0 :(得分:4)
如果我们在同一会话中检索到同一实体,则 hashCode()相同。
预计Hibernate的第一级缓存(此处为Session
)会将实体加载到事务中的实体保持在缓存中,以延长事务的使用寿命。
该实体不会第二次检索,而只是从缓存中检索。
每个会话都从表中检索相同的实体。当我打印时 它们的hashCode()不同。
由于未在会话之间共享已加载的实体,这意味着您没有为该实体覆盖hashCode()
。
因此,为了保证相同的hashCode()
以及它们的相等性(equals()
),请在合理的情况下覆盖equals()/hashCode()
。