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



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

背景

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

目标

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

大问题

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

我的目标是将惰性提取的@Entity注释对象按原样映射,而不提取有意不提取的关系,以便在序列化和传输到远程客户端之前保持对象尽可能小。

有什么想法吗?

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

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

  • 在映射之前,我从实体管理器分离了查询结果(仍然懒散地抓取)
  • 在查询和DTO映射之前(仍然延迟获取)
  • 声明被查询的List final(这样惰性加载机制就不能

覆盖之后提取的属性,但它确实这样做了)

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

如果不能将映射器配置为仅映射部分对象,则可以在将持久性对象传递给映射器之前创建该对象的副本。

可以使用您自己的复制方法,只复制所需的属性,也可以使用EclipseLink、中的CopyGroups

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

一种独立于JPA的方法是为每个字段使用PersistenceProvider.isLoadedWithReference(实体,属性),如果没有加载,只在DTO中使用null。这可以用于直接创建DTO,也可以像James建议的那样在CopyGroup中创建仅提取属性的缩小实体实例。

您可以使用全局属性条件来有条件地映射不懒惰的属性。下面是一个使用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());
  }
});

最新更新