使用EclipseLink的JPA实体的equals()和hashcode()

pro*_*kel 4 java jpa equals

使用JPA,我偶然发现了这个问题equals(),并hashcode(),特别是对尚未被持久化新创建的实体.

我在stackoverflow中找到了以下答案:

我应该在JPA实体中编写equals()方法吗?

这个答案谈到了Hibernate会话.我不使用Hibernate(但是EclipseLink),我不知道JPA提供程序的实现细节,例如这些"会话".

我的问题是,就JPA而言,什么是Hibernate会话?或者,更具体的:如果我不覆盖equals(),并hashcode()在这情况下,我会碰到其中两个对象表示相同的实体问题(同一业务键,如果存在的话)不是"平等"(这意味着equals()返回false)?

使用相同的EntityManager实例是否足以避免出现这些问题(这意味着,在此上下文中,"session"和"EntityManager"是否可以等效使用?)

注:我没有为所有表可用业务键,因此该解决方案使用的业务关键属性equals()hashcode()不能应用.

Jam*_*mes 6

EclipseLink对equals()和hashCode()没有任何特定要求(即使在Id类上).

在持久化上下文中,将保持标识,因此默认值为equals,hashCode将起作用.

对于分离的对象,它们将具有不同的标识,因此除非您覆盖它以使用Id或其他标准,否则equals不会返回true.这不会导致EclipseLink出现问题,但您的应用程序可能依赖于此.

通常,如果您的对象在集合或映射中使用,则应正确实现equals和hashCode,但EclipseLink始终在内部使用Identity Maps和Sets,因此内部应该没有问题.