Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实体管理器在JPA中如何使用hashcode和equals_Java_Hibernate_Jpa_Eclipselink - Fatal编程技术网

Java 实体管理器在JPA中如何使用hashcode和equals

Java 实体管理器在JPA中如何使用hashcode和equals,java,hibernate,jpa,eclipselink,Java,Hibernate,Jpa,Eclipselink,我有一个标准的JEE应用程序和JPA。合并以前分离的实体时,实体管理器是否使用equals或hashcode查找我合并的对象是否已被管理?通常,当实体管理器使用hashcode或等于时?这是否受我使用的JPA引擎的影响,例如Hibernate或eclipselink 计算Hibernate使用的实体的状态 肮脏的检查 默认情况下,Hibernate检查所有托管实体属性。每次加载实体时,Hibernate都会创建所有实体属性值的附加副本。在刷新时,每个托管实体属性都与加载时快照值相匹配 脏检查是通

我有一个标准的
JEE
应用程序和
JPA
。合并以前分离的实体时,实体管理器是否使用
equals
hashcode
查找我合并的对象是否已被管理?通常,当实体管理器使用
hashcode
等于
时?这是否受我使用的JPA引擎的影响,例如
Hibernate
eclipselink

计算Hibernate使用的实体的状态

肮脏的检查

默认情况下,Hibernate检查所有托管实体属性。每次加载实体时,Hibernate都会创建所有实体属性值的附加副本。在刷新时,每个托管实体属性都与加载时快照值相匹配

脏检查是通过检查加载时保存的所有属性值来执行的


equals
hashcode
entitymanager
在Hibernate中的内部工作方式没有关系。

这取决于实现,但是使用实体hashcode或equals方法对于任何JPA机制来说都不是那么可靠。EclipseLink不使用equals或hashcode实现来执行查找或比较-当需要hashcode时,它将使用System.identityHashCode


但是,不正确或效率低下的hashcode和equality方法仍然会对应用程序产生不利影响,特别是在使用集合类型的映射中。我建议您不要在没有很大需要的情况下重写它们。

EntityManager根本不使用hashCode/equals。它们由java.util.Collection类使用。如果实体已被管理,实体管理器在合并期间如何查找?Collection.contains?EntityManager知道它在管理什么对象,至于脏检查,那些使用字节码增强的不需要去检查每个字段是否被更改,由于字节码在字段更改时存储该信息,因此此问题似乎是在寻找解决您遇到的问题的方法。如果您认为您的equality/hashcode实现是导致错误的原因,那么删除这些方法并对其进行测试应该会更容易、更有效。