0

我们的堆栈:Tomcat 7、Spring 3.1.1、OpenJPA 2.2.0

我遇到了一个问题,根源是一个比较:

server1.equals(server2);

server1 和 server2 都是实体“服务器”的实例:

@Entity
public class Server implements Serializable {
   private long id;
   // getters and setters
}

我不得不将比较更改为:

server1.getId().equals(server2.getId());

那个有效,上面那个返回false,即使服务器的id是一样的。我还检查了两个实例的 hashCodes,这两个实例确实有不同的 hashCode。

为什么我们的应用程序中有两个相同实体的实例?

怎么会这样?数据库中只有一个“服务器”实体。

谢谢!
塞巴斯蒂安

4

3 回答 3

4

例如,如果您使用不同的实体管理器或不同的事务加载它们,将会有不同的实例。

于 2012-11-26T06:26:09.803 回答
0

首先想到的是您的应用程序中有 2 个(至少)类加载器。一个加载实体,然后创建实例 server1,第二个加载 server2。通常这些由您的技术堆栈在内部管理

这在 java 中通常是正确的,而不仅仅是在您的特定应用程序中。现在棘手的部分是这些类加载器是从哪里来的。

首先,为了确保是这种情况,您可以尝试打印出类加载器,如下所示:

print before comparison: server1.getClass().getClassLoader()
print before comparison: server2.getClass().getClassLoader()

这可以让您了解那里发生了什么。例如,它可能来自不同的部署单元。

希望这可以帮助

于 2012-11-26T06:26:53.770 回答
0

如果它是不同的会话或外部会话,您将拥有多个Entiry 实例。在您的情况下,您正在进行比较,ClientListHashMapStore因为这不是交易的一部分。这意味着没有会话,您将拥有多个实体实例。理想情况下equals,如果需要比较两个实例,则应覆盖方法。

于 2012-12-20T02:51:25.467 回答