【问题标题】:Hibernate loads same entity multiple time with many to many relation ship and left join?Hibernate使用多对多关系多次加载同一个实体并离开连接?
【发布时间】:2020-09-27 17:04:33
【问题描述】:

我正在尝试加载单个商家实体及其类别,商家和类别之间的关系是多对多。类别实体也有翻译...所以我编写了以下代码来从数据库中检索我需要的数据:

Merchant merchant = queryFactory.selectFrom(QMerchant.merchant)
        .leftJoin(QMerchant.merchant.categories, QMerchantCategory.merchantCategory).fetchJoin()
        .leftJoin(QMerchantCategory.merchantCategory.translations, QMerchantCategoryTranslation.merchantCategoryTranslation).fetchJoin()
        .where(QMerchant.merchant.id.eq(merchantStore.getMerchant().getId()))
        .fetchOne();

但是,我得到的结果是商家有三个类别(相同)的列表,每个类别都有三个翻译对象...

我可以在数据库中检查我正在尝试加载的与商家的关系中只有一个类别,正如您从 JVM ID 的图片中看到的那样,这些都是相同的实例......下面的代码也给出了相同的结果:

@EntityGraph(attributePaths = {"categories", "categories.translations"})
Optional<Merchant> findWithCategoriesById(long id);

如果添加另一个翻译,那么我将有四个类别的商家......

那么我如何告诉休眠加载列表中有一个类别实体的商家实体(因为它应该有,因为只有一个类别与商家相关联),但我还需要为该类别加载所有翻译,如果可能的话,用一个查询来解决它,我可以用两个查询来解决它,但我希望它只有一个......或者如果有更好的理由让两个查询从数据库中提取数据.. .?

【问题讨论】:

标签: java spring spring-boot hibernate jpa


【解决方案1】:

@OneToMany(fetch = FetchType.LAZY) 注释与惰性获取类型方法一起使用。一篇值得阅读的好帖子https://www.baeldung.com/hibernate-lazy-eager-loading

【讨论】:

  • 我到处都在使用 FetchType.LAZY,我不想加载不是问题,问题是休眠重复类别...
【解决方案2】:

问题在于categories 属性是一个列表。您需要改用Set

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    相关资源
    最近更新 更多