【问题标题】:Lazy Initialization Exception in model mapper模型映射器中的延迟初始化异常
【发布时间】:2019-06-22 13:08:10
【问题描述】:

Modelmapper 在从实体转换为 dto 时提供LazyInitializationException

有什么办法可以禁用它。如果在事务块内调用modelmapper.map,它工作正常,但它正在加载我根本不想要的所有惰性对象。 如果懒惰,我想根本不加载它。

转换器 org.modelmapper.internal.converter.MergingCollectionConverter@6a51c12e 未能将 org.hibernate.collection.internal.PersistentSet 转换为 java.util.Set。

原因:org.modelmapper.MappingException:ModelMapper 映射错误:

1) 无法从com.app.flashdiary.entity.Vendor.getApproved()获取值

原因:org.hibernate.LazyInitializationException:无法初始化代理 [com.app.flashdiary.entity.Vendor#1] - 没有会话 在 org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:169)

【问题讨论】:

  • 如果您不需要 DTO 中那些延迟加载的集合,只需指示您的映射器不要使用这些集合,您就不会看到更多 LazyInitializationExceptions。
  • 你能给我一个简单的例子吗。我是modelmapper的新手,不知道如何跳过全局映射器。
  • 我无法帮助您使用 modelMapper - 没有使用过它,但我确信必须有一种方法让它知道应该跳过某些属性。您必须自己找到解决方案。最简单的解决方案是从映射目标对象(您提到的 DTO)中删除不需要的属性。那么您就不需要指示映射器跳过这些属性,因为它们已被删除。

标签: java hibernate modelmapper


【解决方案1】:

我从这里找到了解决方案:

https://github.com/modelmapper/modelmapper/issues/97

modelMapper.getConfiguration().setPropertyCondition(new Condition<Object, Object>() {
      public boolean applies(MappingContext<Object, Object> context) {
        return !(context.getSource() instanceof PersistentCollection);
      }
    });

【讨论】:

  • 在映射对象时忽略某些内容不应被视为解决方案。当不需要时,您不会在目标对象中包含变量,对吗?
【解决方案2】:

我改进了@smile 响应,他的解决方案不会映射任何PersistentCollection。取而代之的是,没有LazyInitializationException 的对象将被正确映射:

    modelMapper.getConfiguration().setPropertyCondition(new Condition<Object, Object>() {
        public boolean applies(MappingContext<Object, Object> context) {
            //if the object is a PersistentCollection could be not initialized 
            //in case of lazy strategy, in this case the object will not be mapped:
            return (!(context.getSource() instanceof PersistentCollection) 
            || ((PersistentCollection)context.getSource()).wasInitialized());
        }
    });

【讨论】:

    【解决方案3】:

    JAVA_8

    modelMapper.getConfiguration()
               .setPropertyCondition(context -> 
                     !(context.getSource() instanceof PersistentCollection)
                )
    

    【讨论】:

      猜你喜欢
      • 2016-06-16
      • 2012-07-27
      • 2014-03-21
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多