首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将EclipseLink设置为LazyLoad集合,但该集合仍通过Jersey返回

将EclipseLink设置为LazyLoad集合,但该集合仍通过Jersey返回
EN

Stack Overflow用户
提问于 2014-10-10 16:48:37
回答 3查看 469关注 0票数 1

我设置了一个懒惰的集合,因为Jersey上的rest有效负载太多了,而且我实际上不需要一直填充这个特定的集合。

我将集合设置为Lazy,希望它不会出现在我的rest响应中,但它仍在填充中。

泽西是不是以某种方式触发了集合的数量?

代码语言:javascript
复制
@OneToMany(mappedBy="gpt", orphanRemoval = false, cascade = { javax.persistence.CascadeType.PERSIST, javax.persistence.CascadeType.MERGE }, fetch = FetchType.LAZY)
    @XmlElement     
    @XmlInverseReference(mappedBy = "gpt")
    protected List<PrOpalProject> projects;

我使用的是spring存储库,不确定这是否相关(?)和EclipseLink

编辑:

我的persistence.xml文件使用静态编织,我的pom.xml如下所示:

persistence.xml

代码语言:javascript
复制
<properties>            
            <property name="eclipselink.target-database" value="Oracle"/>            
            <property name="eclipselink.ddl-generation" value="none"/>            
            <property name="eclipselink.weaving" value="static"/>     

        </properties>




<!-- This plugin ensures the EclipseLink static weaving -->
        <plugins>
            <plugin>
                <artifactId>eclipselink-staticweave-maven-plugin</artifactId>
                <groupId>au.com.alderaan</groupId>
                <version>1.0.4</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>weave</goal>
                        </goals>
                        <phase>process-classes</phase>
                        <configuration>
                            <logLevel>ALL</logLevel>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.eclipse.persistence</groupId>
                        <artifactId>eclipselink</artifactId>
                        <version>${eclipselink.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>

        <!--This plugin's configuration is used to store Eclipse m2e settings only. 
            It has no influence on the Maven build itself. -->
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.eclipse.m2e</groupId>
                    <artifactId>lifecycle-mapping</artifactId>
                    <version>1.0.0</version>
                    <configuration>
                        <lifecycleMappingMetadata>
                            <pluginExecutions>
                                <pluginExecution>
                                    <pluginExecutionFilter>
                                        <groupId>au.com.alderaan</groupId>
                                        <artifactId>eclipselink-staticweave-maven-plugin</artifactId>
                                        <versionRange>[1.0.4,)</versionRange>
                                        <goals>
                                            <goal>weave</goal>
                                        </goals>
                                    </pluginExecutionFilter>
                                    <action>
                                        <execute>
                                            <runOnIncremental>true</runOnIncremental>
                                        </execute>
                                    </action>
                                </pluginExecution>
                            </pluginExecutions>
                        </lifecycleMappingMetadata>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

更新2:

我已经在我的应用程序中放了一些启动代码,并在很好的水平上启用了EclipseLink日志记录。

我有一个懒惰的集合(项目)和一个渴望的集合(产品)

代码语言:javascript
复制
public void init() {


          List<PrGPT> gpts = gptService.getAllGPTs();

          for (PrGPT prGPT : gpts) {
              System.out.println(prGPT.getProjects().size());
              System.out.println(prGPT.getProducts().size());
        }

在我的控制台中,只有对getProjects.size()的调用才会导致SQL trigger...implying,如果Jersey不在考虑之列,那么延迟加载是有效的。请参阅下面的控制台输出:

代码语言:javascript
复制
[EL Fine]: sql: 2014-10-13 16:48:16.896--ServerSession(2099597535)--Connection(347358184)--Thread(Thread[localhost-startStop-1,5,main])--SELECT ID, APPROVED_PRIORITY, DISEASE, DISEASE_AREA, DPOM_BPOM_PHASE, IMED, MOLECULE_OR_TYPE_OF_PRODUCT, PLANNING_STATUS, PROGRAM_CATEGORY_DESC, PROGRAM_TYPE_DESC, PROJECT_CODE, PROJECT_NM, STATE, PROJECT_TYPE, THERAPY_AREA, GPT FROM PR_OPAL_PROJECT WHERE (GPT = ?)
    bind => [17000]
0
0
[EL Fine]: sql: 2014-10-13 16:48:22.817--ServerSession(2099597535)--Connection(2007184558)--Thread(Thread[localhost-startStop-1,5,main])--SELECT ID, APPROVED_PRIORITY, DISEASE, DISEASE_AREA, DPOM_BPOM_PHASE, IMED, MOLECULE_OR_TYPE_OF_PRODUCT, PLANNING_STATUS, PROGRAM_CATEGORY_DESC, PROGRAM_TYPE_DESC, PROJECT_CODE, PROJECT_NM, STATE, PROJECT_TYPE, THERAPY_AREA, GPT FROM PR_OPAL_PROJECT WHERE (GPT = ?)
    bind => [17050]
0
0
[EL Fine]: sql: 2014-10-13 16:48:25.06--ServerSession(2099597535)--Connection(202457351)--Thread(Thread[localhost-startStop-1,5,main])--SELECT ID, APPROVED_PRIORITY, DISEASE, DISEASE_AREA, DPOM_BPOM_PHASE, IMED, MOLECULE_OR_TYPE_OF_PRODUCT, PLANNING_STATUS, PROGRAM_CATEGORY_DESC, PROGRAM_TYPE_DESC, PROJECT_CODE, PROJECT_NM, STATE, PROJECT_TYPE, THERAPY_AREA, GPT FROM PR_OPAL_PROJECT WHERE (GPT = ?)
    bind => [9500]
1
0

对"getProducts.size()“的调用不会触发SQL。

所以我只能假设这是新泽西的东西。

尽管如此,在网上浏览时,我已经将我的XMLAccessorType设置为"@XmlAccessorType(XmlAccessType.FIELD)“。这显然不应该导致延迟加载的集合被带过来。

问候

EN

回答 3

Stack Overflow用户

发布于 2014-10-20 20:56:46

事实上,这很可能是“泽西的事情”。防止这种情况的最简单方法是为数据库实体和Web服务的DTO创建单独的类,并在它们之间进行映射。如果你不想写太多的样板代码,可以使用一些mapper,例如Dozer。

这种方法还有其他优点。例如,您可以从XML Schema生成DTO类。但最重要的是,它将DB模式与接口解耦。这绝对是基于SOAP的网络服务的首选方法(参见Do Domain Classes usually get JPA or JAXB Annotations or both?中的注释)。由于REST根据定义与底层资源捆绑在一起,因此它可能是不同的。但是,如果您的服务不仅仅是简单的CRUD,那么您肯定应该考虑重构,因为这种分层的体系结构为您提供了所需的灵活性。

票数 1
EN

Stack Overflow用户

发布于 2014-10-10 22:24:51

确保您的实体正在被编织。如果不使用运行时/构建时编织,延迟加载将不起作用。

票数 0
EN

Stack Overflow用户

发布于 2014-10-14 22:24:15

我猜Jersey触发加载是因为@XMLElement注释。也许你的问题和this question类似。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26295410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档