如何防止eclipse-link在DTO映射期间获取延迟加载的属性?

时间:2013-07-08 15:19:27

标签: java jpa lazy-loading glassfish-3 data-transfer-objects

我有点悖论的问题,但我会尝试尽可能地解释它。

背景

我有一个包含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寻找类似的内容。

到目前为止我尝试了什么(没有成功):

  • 我在映射之前从实体管理器中分离了查询结果 (仍懒得取物)
  • 查询后清除并关闭实体管理器 在DTO映射之前(仍然是懒惰的提取)
  • 宣布被查询 列出final(这样延迟加载机制不能

覆盖之后获取的属性,但确实如此)

非常感谢您的帮助!

3 个答案:

答案 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());
  }
});