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