我正在尝试将一个 DTO 映射到它的对应物,一个 Hibernate 实体。我从 Hibernate session 加载实体并直接执行映射。
这是我得到的异常:
javassist.NotFoundException: my.pkg.MyEntity$$EnhancerByCGLIB$$a7950497
at javassist.ClassPool.get(ClassPool.java:436)
at ma.glasnost.orika.impl.generator.JavassistCompilerStrategy.assureTypeIsAccessible(JavassistCompilerStrategy.java:181)
at ma.glasnost.orika.impl.generator.MapperGenerator.build(MapperGenerator.java:56)
at ma.glasnost.orika.impl.DefaultMapperFactory.buildMapper(DefaultMapperFactory.java:1057)
at ma.glasnost.orika.impl.DefaultMapperFactory.lookupMapper(DefaultMapperFactory.java:599)
at ma.glasnost.orika.impl.DefaultMapperFactory.lookupMapper(DefaultMapperFactory.java:566)
at ma.glasnost.orika.impl.MapperFacadeImpl.resolveMapper(MapperFacadeImpl.java:516)
at ma.glasnost.orika.impl.MapperFacadeImpl.resolveMappingStrategy(MapperFacadeImpl.java:199)
at ma.glasnost.orika.impl.MapperFacadeImpl.map(MapperFacadeImpl.java:337)
at ma.glasnost.orika.impl.MapperFacadeImpl.map(MapperFacadeImpl.java:357)
at ma.glasnost.orika.impl.ConfigurableMapper.map(ConfigurableMapper.java:148)
这是在我的工厂构建器上配置的 HibernateUnenhanceStrategy,这是我的 Mapper 的样子:
public class MyMapper extends ConfigurableMapper
{
@Override
protected void configureFactoryBuilder(DefaultMapperFactory.Builder factoryBuilder)
{
factoryBuilder.compilerStrategy(new JavassistCompilerStrategy());
factoryBuilder.unenhanceStrategy(new HibernateUnenhanceStrategy());
}
@Override
protected void configure(MapperFactory factory)
{
factory.classMap(MyEntity.class, MyDTO.class);
}
}
我现在的解决方法是在从 session 加载和使用 Orika 进行映射之间自行取消增强实体,但我真的不想对此说得那么明确。我怎样才能让它工作?
最佳答案
虽然这个问题很老,但这是我的解决方案,以防有人遇到同样的问题。
HibernateUnenhancerStrategy 似乎没有应用于目标对象(代理)。
但是,有一个简单的解决方法。 MapperFacade 展示了一个重写的 map() 方法,它允许传递目标类型:
<S, D> void map(S sourceObject, D destinationObject, Type<S> sourceType, Type<D> destinationType);
所以你的调用看起来类似于:
mapperFacade.map(myDto, myProxiedEntity,
null, TypeFactory.valueOf(MyEntity.class));
关于java - Orika 映射到 Hibernate 实体抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21783898/