延迟加载似乎不适用于我的应用程序,我不知道为什么。
我有与下面相关的实体:
public class Participant {
private Long id;
@OneToMany( mappedBy = "participant", fetch = FetchType.LAZY )
private Set<RequestProduct> requestProducts;
@OneToMany( mappedBy = "participant", fetch = FetchType.LAZY )
private Set<ParticipantRank> participantRanks;
@OneToMany( mappedBy = "participant", fetch = FetchType.LAZY )
private Set<RequestProductParticipant> requestProductParticipants;
}
和
public class RequestProduct {
private Long id;
@Column
private String identifier;
@ManyToOne( fetch = FetchType.LAZY )
private Participant participant;
}
和存储库:
public interface RequestProductRepository extends JpaRepository<RequestProduct, Long> {
Optional<RequestProduct> findByIdentifier( String identifier );
}
和服务方法:
@Transactional
@Service
public class ServiceImpl {
private RequestProductRepository repo;
public void modifyRequestProduct(String identifier){
//THE PROBLEM IS HERE
Optional<RequestProduct> product = repo.findByIdentifier( identifier );
}
}
当我调用findByIdentifier
方法时,似乎所有数据都被加载。我有这些堆栈跟踪:
[ taskExecutor-7] org.hibernate.type.CollectionType : Created collection wrapper: [org.module.module.models.Participant.requestProducts#1]
[ taskExecutor-7] org.hibernate.type.CollectionType : Created collection wrapper: [org.module.module.models.Participant.participantRanks#1]
[ taskExecutor-7] org.hibernate.type.CollectionType : Created collection wrapper: [org.module.module.models.Participant.requestProductParticipants#1]
并且调用了从3个表中的每个表中加载所有数据的3个大select
查询。到底是怎么回事?这是正常的吗?
谢谢你的解释。
刚遇到这个问题并找到了解决方案。之所以发生这种情况,是因为集合的类型为Set。 Java默认尝试通过检查其所有属性是否等于计数器对象来检查集合中是否已存在对象,以便它将获取所有参与者集合。
我通过覆盖模型的equals和hash方法修复了这个问题,并且只使用ID对它们进行了比较:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
RequestProduct requestProduct = (RequestProduct) o;
return Objects.equals(id, requestProduct.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
对不起,差不多晚了一年= /