2

我有一个自相矛盾的问题,但我会尽可能地解释它的意义。

背景

我有一个涉及 Glassfish 3.1.2.2、JPA 2.0(eclipse-link 2.3.3)、MySQL 数据库和独立 Swing 客户端的 3 层应用程序设置。我通过远程接口使用 JNDI 访问 EJB。此外,我使用静态编织是为了从延迟加载复杂关系中受益。在独立的 Swing 客户端上,我使用负载组来选择性地仅获取我真正需要的关系。

目标

为了减少网络流量,我计划使用这个模型映射器将查询到的@Entity注解的数据库对象转换为DTO(Data Transfer Objects,POJO) 。

大问题

在@Entity-Objects 到相应 DTO 的映射过程中,@Entity 上每个字段的访问器都会被访问,这反过来又会从数据库中捕获所有未获取(延迟加载的间接列表)字段,从而导致大再次对象。

我的目标是按原样映射延迟获取的@Entitiy 注释对象,而不获取有意未获取的关系,以便在将对象序列化并传输到远程客户端之前尽可能地保持对象小。

有任何想法吗 ?

编辑:我从使用Dozer的人那里找到了这个线程,我正在为ModelMapper寻找类似的东西。

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

  • 我在映射之前从实体管理器中分离了查询结果(仍然是懒惰的获取)
  • 在查询之后和 DTO 映射之前清除和关闭实体管理器(仍然是惰性获取)
  • 将查询到的 List 声明为 final (这样延迟加载机制就不能

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

非常感谢您提前提供的帮助!

4

3 回答 3

1

如果您的映射器无法配置为仅映射部分对象,那么您可以在将持久性对象传递给映射器之前创建其副本。

要么使用您自己的仅复制所需属性的复制方法,要么您可以在 EclipseLink 中使用 CopyGroups,

http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup#Copy_Examples

于 2013-07-09T13:33:37.210 回答
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());
  }
});
于 2014-11-19T05:40:52.377 回答
1

独立于 JPA 的方法是对每个字段使用 PersistenceProvider.isLoadedWithReference(entity, attribute),如果未加载,只需在 DTO 中使用 null。这可用于直接创建 DTO,或在 CopyGroup 中,正如 James 建议的那样,制作仅提取属性的按比例缩小的实体实例。

于 2013-07-09T14:14:45.323 回答