【问题标题】:Hibernate lazy fetchingHibernate 延迟抓取
【发布时间】:2022-01-03 17:39:36
【问题描述】:

我有 3 个实体,例如 CategorySubCategoryCourse。 一个类别可以有很多子类别,一个子类别可以有很多课程。 我已经在类别之间建立了一对多的关系——子类别和子类别——当然是 Fetch.Lazy。

class Category {
    @OneToMany(mappedBy = "category")
    private Set<SubCategory> subCategories = new HashSet<>();
}

class SubCategory {
    @ManyToOne
    private Category category;

    @OneToMany(mappedBy = "subCategory")
    private Set<Course> courses = new HashSet<>();
}

class Course {
    @ManyToOne
    private SubCategory subCategory;
}

@Service
class CategoryService {
    @PersistenceContext
    private EntityManager entityManager;

    public List<Category> findAll() {
        TypedQuery<Category> query =
            entityManager.createQuery("select c from Category c join fetch c.subCategories", Category.class);
        return query.getResultList();
    }
}

@RestController
@RequestMapping
class CategoryController {
    @Autowired
    private CategoryService categoryService;

    @GetMapping
    public List<Category> findAll() {
        return categoryService.findAll();
    }
}

现在,当我使用 fetch join sub-categories 触发 getAll Categories 查询时,我会得到带有加入服务的子类别的类别,但是一旦要给出输出,它就会触发“n”个小查询来获取课程和把它作为输出给我,但我不需要它如何解决?

【问题讨论】:

  • 能贴出代码吗?

标签: spring-boot hibernate spring-data-jpa


【解决方案1】:

您可以在课程关联上设置批量大小,Hibernate 将查找未初始化的集合并一次最多加载 128 个(例如)

class SubCategory {
    @ManyToOne
    private Category category;

    @BatchSize(size = 128)
    @OneToMany(mappedBy = "subCategory")
    private Set<Course> courses = new HashSet<>();
}

【讨论】:

  • 当我点击 findAll Categories API 时,它应该只加载我从服务中的查询中获得的数据,但由于延迟加载,它也给了我课程,但我不想要它。我想要的是我应该能够控制什么时候应该加入课程,什么时候不加入。
  • 希望这篇文章对您有所帮助:thorben-janssen.com/dont-expose-entities-in-api
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 2016-09-23
  • 1970-01-01
  • 2014-05-05
  • 2011-09-11
  • 1970-01-01
  • 2015-12-07
相关资源
最近更新 更多