我有点悖论的问题,但我会尝试尽可能地解释它。
背景
我有一个包含Glassfish 3.1.2.2,JPA 2.0(eclipse-link 2.3.3),MySQL数据库和独立Swing-Client的3层应用程序设置。我通过远程接口使用JNDI访问EJB。此外,我使用静态编织,以受益于延迟加载复杂的关系。在独立的Swing客户端上,我使用加载组来选择性地仅获取我真正需要的关系。
目标
为了减少网络流量,我计划使用此model mapper将查询的@Entity带注释的数据库对象转换为DTO(数据传输对象,POJO)。
重大问题
在将@ Entity-Objects映射到相应的DTO期间,访问@Entity上每个字段的访问者,然后从数据库中捕获所有未获取的(延迟加载的间接列表)字段,再次导致大物件。
我的目标是按原样映射延迟获取的@Entitiy注释对象,而不会获取有意的非获取关系,以便在序列化序列化并转移到远程客户端之前保持对象尽可能小
有什么想法吗?
编辑:我发现使用this thread的人发现了Dozer,我正在为ModelMapper寻找类似的内容。到目前为止我尝试了什么(没有成功):
覆盖之后获取的属性,但确实如此)
非常感谢您的帮助!
答案 0 :(得分:1)
如果无法将映射器配置为仅映射部分对象,则可以在将持久性对象传递给映射器之前创建该持久性对象的副本。
使用您自己的复制方法只复制所需的属性,或者您可以在EclipseLink中使用CopyGroups,
http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup#Copy_Examples
答案 1 :(得分:1)
JPA独立方式是对每个字段使用PersistenceProvider.isLoadedWithReference(实体,属性),如果未加载,则在DTO中使用null。这可以用于直接创建DTO,或者在James建议用于创建仅获取属性的缩小实体实例的CopyGroup中。
答案 2 :(得分:1)
您可以使用全局属性条件有条件地映射非惰性的属性。以下是使用JPA2的PersistenceUnitUtil:
的示例final PersistenceUnitUtil unitUtil = entityManagerFactory.getPersistenceUnitUtil();
modelMapper.getConfiguration().setPropertyCondition(new Condition<Object, Object>() {
public boolean applies(MappingContext<Object, Object> context) {
return unitUtil.isLoaded(context.getSource());
}
});