当前位置: 首页 > 知识库问答 >
问题:

使用@lazyToOne(lazyToOneOption.no_proxy)Hibernate惰性加载

杜英范
2023-03-14

我们目前有几个@OneToOne关系,由于已知的惰性加载的限制,它们总是会急切地从反方向获取。

为了启用逆关系的延迟加载,我正在尝试启用构建时字节码检测。

到目前为止我所做的...

[INFO] --- maven-antrun-plugin:1.7:run (Instrument domain classes) @ MyApp-entities ---
[INFO] Executing tasks

instrument:
[instrument] starting instrumentation
[INFO] Executed tasks
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "client", optional=false)
    @LazyToOne(LazyToOneOption.NO_PROXY)
    public ClientPrefs getClientPrefs() {
        return clientPrefs;
    }

    public void setClientPrefs(ClientPrefs clientPrefs) {
        this.clientPrefs = clientPrefs;
    }
private FieldHandler fieldHandler;
15:54:09,720 INFO  [org.hibernate.tuple.entity.EntityMetamodel] (ServerService Thread Pool -- 56) HHH000157: Lazy property fetching available for: uk.co.myapp.entities.Session
15:54:09,730 INFO  [org.hibernate.tuple.entity.EntityMetamodel] (ServerService Thread Pool -- 57) HHH000157: Lazy property fetching available for: uk.co.myapp.entities.Session
15:54:09,969 INFO  [org.hibernate.tuple.entity.EntityMetamodel] (ServerService Thread Pool -- 56) HHH000157: Lazy property fetching available for: uk.co.myapp.entities.Client
15:54:09,970 INFO  [org.hibernate.tuple.entity.EntityMetamodel] (ServerService Thread Pool -- 57) HHH000157: Lazy property fetching available for: uk.co.myapp.entities.Client
15:54:09,999 INFO  [org.hibernate.tuple.entity.EntityMetamodel] (ServerService Thread Pool -- 56) HHH000157: Lazy property fetching available for: uk.co.myapp.entities.Country
15:54:10,003 INFO  [org.hibernate.tuple.entity.EntityMetamodel] (ServerService Thread Pool -- 57) HHH000157: Lazy property fetching available for: uk.co.myapp.entities.Country
15:54:10,054 INFO  [org.hibernate.tuple.entity.EntityMetamodel] (ServerService Thread Pool -- 56) HHH000157: Lazy property fetching available for: uk.co.myapp.entities.Pool
15:54:10,054 INFO  [org.hibernate.tuple.entity.EntityMetamodel] (ServerService Thread Pool -- 57) HHH000157: Lazy property fetching available for: uk.co.myapp.entities.Pool
15:54:10,569 INFO  [org.hibernate.tuple.entity.EntityMetamodel] (ServerService Thread Pool -- 56) HHH000157: Lazy property fetching available for: uk.co.myapp.entities.User
15:54:10,624 INFO  [org.hibernate.tuple.entity.EntityMetamodel] (ServerService Thread Pool -- 57) HHH000157: Lazy property fetching available for: uk.co.myapp.entities.User

这些关系现在不再急切地加载...但是它们也不会延迟加载,它们只是静默地返回null。

我尝试从实体中删除fieldhandled接口和fieldhandler字段,因为我不确定是否需要这样做,在此之后,我在启动时不再获得'hhh000157:Lazy property fetching available for:'消息,并且默认情况下返回到急切加载。

我是不是漏了什么?hibernate文档并没有明确说明如何实际设置此功能

编辑:根据注释添加了Ant任务配置:

<build>
        <plugins>
               <plugin>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.7</version>
                    <executions>
                        <execution>
                            <phase>process-classes</phase>
                            <id>Instrument domain classes</id>
                            <configuration>
                                <target name="instrument">
                                    <taskdef name="instrument"
                                        classname="org.hibernate.tool.instrument.javassist.InstrumentTask">
                                        <classpath>
                                            <path refid="maven.dependency.classpath" />
                                            <path refid="maven.plugin.classpath" />
                                        </classpath>
                                    </taskdef>
                                    <instrument verbose="true">
                                        <fileset dir="${project.build.outputDirectory}">
                                            <include name="MyApp-entities/co/uk/myapp/entities/*.class" />
                                        </fileset>
                                    </instrument>
                                </target>
                            </configuration>
                            <goals>
                                <goal>run</goal>
                            </goals>
                        </execution>
                    </executions>
                    <dependencies>
                        <dependency>
                            <groupId>org.hibernate</groupId>
                            <artifactId>hibernate-core</artifactId>
                            <version>4.2.21.Final</version>
                        </dependency>

                        <dependency>
                            <groupId>org.javassist</groupId>
                            <artifactId>javassist</artifactId>
                            <version>3.18.1-GA</version>
                        </dependency>
                    </dependencies>
                </plugin>
           </plugins>
    </build>

共有1个答案

裴俊能
2023-03-14

@lazyToOne(lazyToOneOption.NO_Proxy)在persistance.xml中需要

懒惰,返回请求引用时加载的实际对象(对于该选项,字节码增强是强制的,如果类没有增强,则返回代理)应该避免使用该选项,除非您负担不起代理的使用

NO_PROXY选项

 类似资料:
  • 问题内容: hibernate中的property标签的lazy属性允许按照以下链接延迟加载属性:http : //docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping- declaration -属性 lazy(可选-默认为false):指定在首次访问实例变量时应延迟获取此属性。它需要构建时字节码检测

  • 这组订单应该是惰性加载的,但我得到以下异常:org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是org.hibernate.lazyInitializationException:未能懒洋洋地初始化Role:...,没有会话或会话被关闭 根本原因:org.hibernate.lazyInitializationExcept

  • 问题内容: 好吧,我的疑问很简单:为了获得最佳性能,建议在我不需要使用的属性中始终使用惰性初始化(这很明显)。因此,请想象以下类: 在我的主类中,我将未初始化的具有“ type”属性的人称为“波纹管”: 因此,我从数据库中获得了一个简单的Person对象,并在控制台上打印了person类型。在这一刻,代理CGLIB可以发挥作用,并且可以发挥作用,一切正常。 但是,我在这里提出我的问题: 1-当我请

  • 问题内容: 我记得在JPA或hibernate中有一个注释,告诉hibernate使用getId / setId方法而不是property(我们注释属性)。如果没有此设置,则getId会导致命中数据库并填充该对象的所有字段,这不是我想要的。有人知道该注释是什么吗? 例: 因此,当id已在hibernate项目代理对象中时,ticket.getProject.getId()导致命中数据库以获取项目。

  • 我在应用程序中工作。流程和往常一样:。 我用注释了服务层类,从而将该类中的每个方法都标记为事务性的。在服务类中,我调用以获取某个域对象,然后将其转换为对象,该对象将传递给Controller。为了将域对象转换为,我编写了另一个自定义静态类(只有静态方法的类),如,它将进行此转换。 现在,域对象有一些子对象(),它被懒洋洋地加载。因此,当我在中访问子getter方法时,会发出一个额外的数据库调用,该

  • 我有两个大表(每个表>一亿行),让我们把它们称为Parent和Child(Parent与Child有一个懒散的一对多关系)。当我使用联接提取时,查询速度非常慢,而且我还得到一个Hibernate警告“HH000104 firstresult maxresults specified with collection fetch Application in Memory”,因为我使用了一个限制。 因