这是可行的,但是当我尝试删除courses.size时,我没有得到会话错误。
@Transactional
public List<Course> initiateCourses(Long id) {
Instructor instructor = instructorRepository.findById(2L).get();
List<Course> courses = instructor.getCourses();
courses.size();
return courses;
}它起作用了,但感觉像个黑客。
此外,我还发现了另一种加载惰性集合的方法。
@Repository
public interface InstructorRepository extends CrudRepository<Instructor, Long> {
@Query("SELECT p FROM Instructor p LEFT JOIN FETCH p.courses WHERE p.id = ?1")
Optional<Instructor> findByIdAndFetchCourseEagerly(Long id);
}我应该使用性能明智的哪一个?或者有没有更好的方法来获取惰性初始化对象。
发布于 2021-09-03 09:56:26
您可以使用@EntityGraph指定应获取对象层次结构的哪些部分:
@Repository
public interface InstructorRepository extends CrudRepository<Instructor, Long> {
@EntityGraph(type = EntityGraphType.FETCH, attributePaths = {"courses"})
Optional<Instructor> findById(Long id);
}发布于 2021-09-03 10:10:21
在您从中检索元素或调用size()方法之前,不会初始化此代理。有几种方法可以在不使用“魔法”的情况下解决问题:
Hibernate.init(),并在从方法返回它之前将其传递给您的集合代理。https://stackoverflow.com/questions/69042830
复制相似问题