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

az31mfrm  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(57)

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

@Entity
@Data
public class LaunchGrossSalesBasis {
 ...

 @ManyToOne(fetch = FetchType.LAZY)
 @JoinColumn(name = "launch_id")
 private LaunchModel launchModel;

 @ManyToOne(fetch = FetchType.LAZY)
 @JoinColumn(name = "version_id")
 private LaunchModelVersion launchModelVersion;

 ...
} 

@Entity
@Data
@NoArgsConstructor
public class LaunchModel {
 ...
 Integer id;

 // Unidirectional - so no mapping in this class
     ...
}

@Entity
@Data
@NoArgsConstructor
public class LaunchVersionModel {
 ...
 Integer id;

 // Unidirectional - so no mapping in this class
 ...
}

public interface LaunchGrossSalesBasisRepository extends BaseCrudRepository<LaunchGrossSalesBasis, Integer> {

 //working but no effect 
 //@Query("SELECT l FROM LaunchGrossSalesBasis l INNER JOIN l.launchModelVersion v INNER JOIN l.launchModel m WHERE v.id = ?1 AND m.id=?2")  
@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)
LaunchGrossSalesBasis findByVersionIdAndLaunchId(Integer versionId, Integer launchId);

... 

}

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

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=? 
Hibernate: select launchmode0_.id as id1_52_0_, ... from launch_model launchmode0_ where launchmode0_.id=?
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中找到。

相关问题