我们的堆栈:Tomcat 7,Spring 3.1.1,OpenJPA 2.2.0
我遇到了一个问题,根是一个比较:
server1.equals(server2);
server1和server2都是实体“Server”的实例:
@Entity
public class Server implements Serializable {
private long id;
// getters and setters
}
我不得不将comparisson改为:
server1.getId().equals(server2.getId());
即使服务器的ID相同,上面的那个也会返回false。 我还检查了两个实例的hashCodes,这两个实例确实有一个不同的hashCode。
为什么我们的应用程序中有两个相同实体的实例?
怎么会发生这种情况?数据库中只有一个“服务器”实体。
谢谢!
塞巴斯蒂安
答案 0 :(得分:4)
如果您使用不同的实体管理器或不同的事务加载它们,则会有不同的实例。
答案 1 :(得分:0)
首先想到的是你的应用程序中有2个(至少)类加载器。一个加载实体,然后创建实例server1,第二个加载server2。通常这些是由您的技术堆栈内部管理
这在java中通常是正确的,而不仅仅是在您的特定应用程序中。 现在棘手的部分是这些类加载器的来源。
首先,为了确保这种情况,您可以尝试打印出类加载器,如下所示:
print before comparison: server1.getClass().getClassLoader()
print before comparison: server2.getClass().getClassLoader()
这可以让您了解那里发生的事情。 例如,它可能来自不同的部署单元。
希望这有帮助
答案 2 :(得分:0)
如果是不同的会话或外部会话,您将有多个Entiry实例。在您的情况下,您正在ClientListHashMapStore
进行比较,而不是交易的一部分。这意味着没有会话,您将拥有多个实体实例。理想情况下,如果需要比较两个实例,则应覆盖equals
方法。