Spring JPARepository还没有Lazy仍然渴望

时间:2016-11-16 04:22:16

标签: spring-boot spring-data-jpa

我有对象主位置和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?

由于

1 个答案:

答案 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只选择每个案例所需的数据。