我设置了一个懒惰的集合,因为Jersey上的rest有效负载太多了,而且我实际上不需要一直填充这个特定的集合。
我将集合设置为Lazy,希望它不会出现在我的rest响应中,但它仍在填充中。
泽西是不是以某种方式触发了集合的数量?
@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
<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日志记录。
我有一个懒惰的集合(项目)和一个渴望的集合(产品)
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不在考虑之列,那么延迟加载是有效的。请参阅下面的控制台输出:
[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)“。这显然不应该导致延迟加载的集合被带过来。
问候
我
发布于 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,那么您肯定应该考虑重构,因为这种分层的体系结构为您提供了所需的灵活性。
发布于 2014-10-10 22:24:51
确保您的实体正在被编织。如果不使用运行时/构建时编织,延迟加载将不起作用。
发布于 2014-10-14 22:24:15
我猜Jersey触发加载是因为@XMLElement注释。也许你的问题和this question类似。
https://stackoverflow.com/questions/26295410
复制相似问题