如果Id不等于,hibernate如何在同一会话中找到相同的对象

如果Id不等于,hibernate如何在同一会话中找到相同的对象,hibernate,jpa,Hibernate,Jpa,我有一个实体类,它有一个复合id,实体类或复合id类覆盖都不等于,但如果compositeId字段的值相同,findById(compositeId)在同一会话中返回相同的对象。 它不能使用某个代理来定义equals,因为如果它这样做,它也会在不同的会话中返回相同的对象,但在不同的会话中,返回的结果不是相同的实例 代码示例 @Embeddable public class CompositeKey implements Serializable{ @NotBlank privat

我有一个实体类,它有一个复合id,实体类或复合id类覆盖都不等于,但如果compositeId字段的值相同,findById(compositeId)在同一会话中返回相同的对象。 它不能使用某个代理来定义equals,因为如果它这样做,它也会在不同的会话中返回相同的对象,但在不同的会话中,返回的结果不是相同的实例

代码示例

@Embeddable
public class CompositeKey implements Serializable{
    @NotBlank
    private String partKey1;

    @NotBlank
    private String partKey2;
//getter setter
}

实体也没有等号

    @Entity
    @Table(name = "testentity")
    public class TestEntity {

        @EmbeddedId
        private CompositeKey cid;

        @NotBlank
        private String otherFields;
//getter setter
}
在具有不同CompositeKey实例的相同会话调用中,返回相同的实例(如果CompositeKey字段的值相同)。 在不同的会话中,即使CompositeKey字段的值相同,它也会返回不同的实例 我可以通过在控制器中跟踪代码片段来验证这一点

  compositeKey=getNewCompositeKey(partKeyValue1,partKeyValue2)
     Optional<TestEntity> existing = TestEntityRepository.findById(compositeKey);
            if (existing.isPresent()) {
                TestEntity existing1 = existing.get();
                testEntitySet.add(existing1);
                //create a new key and use findById again
                //it gives the same instance if values of fields of
               //compositeKey are same
compositeKey=getNewCompositeKey(partKeyValue1,partKeyValue2)
可选的existing=TestEntityRepository.findById(compositeKey);
if(existing.isPresent()){
TestEntity existing1=existing.get();
testEntitySet.add(现有1);
//创建一个新密钥并再次使用findById
//如果
//组合键是一样的

我这里的问题是在同一个会话中,如果复合Id类上没有equals,它如何每次都找到相同的实例?

每个类都默认实现了
equals
hashcode
源于
Object
类。

但是,复合键的每个新实例都将不相等No等于对象类,那么复合键会如何返回实体的相同实例?复合材料有特殊的处理。事实上,我认为没有什么阻碍您真正进入实际运行时实现。d equals/hashCode方法的缓存项intseed。