@Basic(fetch = FetchType.LAZY)不起作用?

2022-09-01 19:21:38

我使用JPA(Hibernate)和Spring。当我想延迟加载String属性时,我使用以下语法:

@Lob
@Basic(fetch = FetchType.LAZY)
public String getHtmlSummary() {
    return htmlSummary;
}

但是当我查看休眠创建的sql时,似乎此属性不是延迟加载的?我也在ANT脚本中使用这个类来检测这个属性,但它似乎不起作用。org.hibernate.tool.instrument.javassist.InstrumentTask


答案 1

首先,您应该知道 JPA 规范明确规定 LAZY 只是对 JPA 提供程序的提示,因此它不是强制性要求。

要使基本类型延迟提取正常工作,您需要启用字节码增强功能并将配置属性显式设置为:enableLazyInitializationtrue

<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>

答案 2

延迟加载需要字节码检测才能正常工作,因此在我所知道的任何JPA实现中,它都默认不可用。Lob

最好的办法是将 Lob 放入一个单独的实体中,如 ,并使用懒惰加载的一对一关联。HtmlSummary


推荐