我对Spring和Hibernate以及延迟加载有一些困难。有很多问题和答案,但不是我真正想要的。Hibernate Spring JPA只加载特定的懒惰关系
因此,让我们说我有一个Car
类。与id
,name
以及与doors
,windows
和wheels
的一对多关系。因为他们是oneToMany,他们是默认的懒加载这是首选,因为当我想查看名称car
我不想看到轮胎和东西。这适用于我的情况,使用我的存储库的默认findOne()
方法。
但是当我想查看轮胎压力时,我需要初始化tires
关系。我曾经这样做过Hibernate.initialize(car.getTires())
。这会为数据库生成另一个SELECT
查询。现在我想改进我的数据库查询,并选择与tires
,但省略了windows
和doors
。 (这可以在MySQL中使用连接)。让他们加载的选项是没有问题的,因为我不总是想加载tires
关系(我在我的对象上有一些很大的关系)。
我尝试以下方法:
@Query("SELECT c FROM Car c JOIN FETCH c.tires WHERE c.id = :id")
Car findOneWithTiresLoaded(@Param("id") Long id);
这并提供正确的数据。但是在分析了从存储库返回的对象之后,我注意到所有的关系都被加载了。因此,这不仅会返回car
与tires
的关系,还会返回doors
和windows
。 下面给我相同的输出(与moneToMany关系加载)
@Query("SELECT c FROM Car c WHERE id = :id")
Car findOneWithTiresLoaded(@Param("id") Long id);
东西是不是想要的。我预计这只会输出Car
对象而没有所有懒惰的关系。
互联网上的人也建议打电话Car.getTires().size()
。这也会产生另一个SELECT
查询。
有没有什么办法只选择Car
而只装载Tires
关系?没有fetch = FetchType.LAZY
,Hibernate.initialize()
或size()
方法?如何加入一张桌子不可能?另外,我不使用XML进行任何配置。
谢谢!
我是否需要用'@ Table'进行注解的实体?因为我们现在不这样做,如果它不需要,它会更清洁,而不是写它。还是用于对象图?我现在就试试这个。如果这对我们有用,我会将您的答案标记为解决方案。谢谢回复! – Clemenz
不能将'@ Table'省略,我只是习惯用它来定义实体。 – Vaelyr
我刚刚发现'Car'类扩展了一个'Vehicle'类。所以它使用'@ Inheritance'注解。 (也是@ @ DiscriminatorValue('car')注释)。当我尝试在'Car'实体中使用命名图时,它在启动时给我一个错误。 '无法使用此ManagedType [com.example.domain.Vehicle]'上的给定名称[Tires]定位属性。但是我查询'Car'库中的'Car'表。什么会造成这种情况? – Clemenz