Spring Boot Hibernate FetchType LAZY对单向@ManyToOne没有影响

az31mfrm  于 2024-01-06  发布在  Spring
关注(0)|答案(1)|浏览(183)

我使用SpringBoot(v2.0)JPA和hibernate(v5.4)。我有3个实体类LaunchGrossSalesBasis,它连接到LaunchModel和LaunchVersionModel。

  1. @Entity
  2. @Data
  3. public class LaunchGrossSalesBasis {
  4. ...
  5. @ManyToOne(fetch = FetchType.LAZY)
  6. @JoinColumn(name = "launch_id")
  7. private LaunchModel launchModel;
  8. @ManyToOne(fetch = FetchType.LAZY)
  9. @JoinColumn(name = "version_id")
  10. private LaunchModelVersion launchModelVersion;
  11. ...
  12. }
  13. @Entity
  14. @Data
  15. @NoArgsConstructor
  16. public class LaunchModel {
  17. ...
  18. Integer id;
  19. // Unidirectional - so no mapping in this class
  20. ...
  21. }
  22. @Entity
  23. @Data
  24. @NoArgsConstructor
  25. public class LaunchVersionModel {
  26. ...
  27. Integer id;
  28. // Unidirectional - so no mapping in this class
  29. ...
  30. }
  31. public interface LaunchGrossSalesBasisRepository extends BaseCrudRepository<LaunchGrossSalesBasis, Integer> {
  32. //working but no effect
  33. //@Query("SELECT l FROM LaunchGrossSalesBasis l INNER JOIN l.launchModelVersion v INNER JOIN l.launchModel m WHERE v.id = ?1 AND m.id=?2")
  34. @Query(value="select * from launch_gross_sales_basis s inner join launch_model m ON s.launch_id = m.id INNER JOIN launch_model_version v ON s.version_id = v.id where s.version_id =?1 and s.launch_id=?2 ", nativeQuery = true)
  35. LaunchGrossSalesBasis findByVersionIdAndLaunchId(Integer versionId, Integer launchId);
  36. ...
  37. }

字符串
当我从服务层调用findByVersionIdAndLaunchId(versionId,launchId)时,我期望只有一个查询,但我总是得到3个查询。

  1. Hibernate: select * from launch_gross_sales_basis s inner join launch_model m ON s.launch_id = m.id INNER JOIN launch_model_version v ON s.version_id = v.id where s.version_id =? and s.launch_id=?
  2. Hibernate: select launchmode0_.id as id1_52_0_, ... from launch_model launchmode0_ where launchmode0_.id=?
  3. Hibernate: select launchmode0_.id as id1_57_0_, ... from launch_model_version launchmode0_ where launchmode0_.id=?


我尝试了许多不同的方法(包括原生),但我总是得到3个查询。我错过了什么?像这样,我有更多的查询,hibernate为一个复杂的函数触发了200多个查询。
任何线索都会很有帮助。先谢谢你了。

htrmnn0y

htrmnn0y1#

这些额外的请求显然来自实体的lazy字段。您在请求中提到了它们,但Hibernate仍然会延迟加载它们。如果您想在请求中加载它们-将fetch添加到您的joins中。
如果你不使用惰性字段,但想知道为什么Hibernate加载它们-我想答案是因为Lombok的@Data注解。它创建了使用字段的equals/hashcode方法。尝试将其替换为@Getter + @Setter。关于这种情况的更多信息,你可以在this article中找到。

相关问题