在应用程序中可以有多个相同(开放)JPA实体的实例吗?等于对实体实例不起作用?

时间:2012-11-26 06:20:29

标签: java spring jpa entity openjpa

我们的堆栈: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。

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

怎么会发生这种情况?数据库中只有一个“服务器”实体。

谢谢!
塞巴斯蒂安

3 个答案:

答案 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方法。