我有对象主位置和MasterCountries
MasterLocation.java
@Entity
@Table(name = "master_location", schema = "public", catalog = "master_db")
@NamedEntityGraphs({
@NamedEntityGraph(name = "MasterLocation.joinsWithMasterCountries",attributeNodes = {
@NamedAttributeNode("masterCountriesByCountryCode")
}),
@NamedEntityGraph(name = "MasterLocation.noJoins",attributeNodes = {})
})
public class MasterLocation {
private String locationCode;
private String locationName;
private String countryCode;
private Integer agencyCode;
private String port;
private String place;
private String userId;
private Timestamp dateCreated;
private Timestamp lastModified;
private String portRefFrom;
private String portRefTo;
private String valid;
private String regionCode;
private String bookingRef;
private MasterCountries masterCountriesByCountryCode;
@ManyToOne(fetch = FetchType.LAZY)
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(referencedColumnName = "iso_3166_1_alpha_2_code", name = "country_Code")
public MasterCountries getMasterCountriesByCountryCode() {
return masterCountriesByCountryCode;
}
}
MasterLocationRepository.java
@Repository
public interface MasterLocationRepository extends JpaRepository<MasterLocation, Integer> {
@EntityGraph(value = "MasterLocation.noJoins",type = EntityGraph.EntityGraphType.LOAD)
Page<MasterLocation> findByLocationNameLikeIgnoreCase(String locationName, Pageable pageable);
}
为什么Object MasterCountries仍然加载在findByLocationNameLikeIgnoreCase上?如何禁用此存储库中的Fetch MasterCountries?
由于
答案 0 :(得分:0)
我想您使用Hibernate作为JPA提供程序。默认情况下,所有单个属性都会被急切加载,甚至是一对一或多对一关系,注释为Lazy。
为了能够延迟加载单个属性,您必须使用hibernate的字节码增强支持。在this Vlad Mihalcea's post中,您将找到如何使用Maven激活它。您只需将以下插件添加到 pom.xml 文件中:
<plugin>
<groupId>org.hibernate.orm.tooling</groupId>
<artifactId>hibernate-enhance-maven-plugin</artifactId>
<version>${hibernate.version}</version>
<executions>
<execution>
<configuration>
<enableLazyInitialization>true</enableLazyInitialization>
</configuration>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
还尝试将@EntityGraph注释类型参数更改为FETCH,而不是LOAD,或使用FetchType.LAZY注释masterCountriesByCountryCode。使用当前配置(EntityGraphType.LOAD),EntityGraph定义中未包含的属性将保持其默认的FETCH / LOAD配置。看一下here了解更多详情
在another post Vlad再次讨论字节码增强并提供另一种选择:子实体。我自己还没有尝试过subentities选项,所以我无法告诉你它的工作情况。
最后另一个选项,需要更多的工作,但我认为是最好的选择,是使用投影DTO只选择每个案例所需的数据。