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

17 java orm hibernate jpa lazy-loading

我在Spring中使用JPA(Hibernate).当我想延迟加载Stirng属性时,我使用以下语法:

@Lob
@Basic(fetch = FetchType.LAZY)
public String getHtmlSummary() {
    return htmlSummary;
}
Run Code Online (Sandbox Code Playgroud)

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

请帮我.

在Khosro.

Vla*_*cea 6

首先,你应该知道JPA规范明确规定LAZY只是对JPA提供者的一个提示,所以它不是强制性要求。

要使基本类型延迟获取工作,您需要启用字节码增强并将enableLazyInitialization配置属性显式设置为true

<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>
Run Code Online (Sandbox Code Playgroud)

  • 我包含了这个插件,但仍然不起作用。(在选择实体时,文件的列也会被投影) (3认同)
  • 正如此 StackOverflow 答案中所述,**enableLazyInitialization** 仅需要 **基本类型延迟获取才能工作**。如果关联被标记为“FetchType.LAZY”,则可以延迟获取,而不需要任何额外的设置。 (2认同)

Hen*_*ing 5

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

你最好的选择是将Lob放入一个单独的实体中HtmlSummary,并使用一个懒惰加载的一对一关联.


Mar*_*ton -3

延迟获取仅适用于对其他实体或实体集合的引用。它不适用于 String 或 int 等值。