如何使用Hibernate4Module

时间:2017-10-30 19:49:52

标签: java spring jackson lazy-loading hibernate-4.x

为了避免使用.size手动加载字段,我想实现Hibernate4Module。不幸的是,在所有配置上都是新手,我似乎无法使其发挥作用。我从java获得的只有:Could not write content: could not initialize proxy - no Session

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"servlet.controller"})
public class ServletConfig extends WebMvcConfigurerAdapter {
    ...
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        ObjectMapper mapper = null;
        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                mapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();

            }
        }
        if (mapper == null) {
            MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
            converter.setObjectMapper(mapper = new ObjectMapper());
            converters.add(converter);
        }
        Hibernate4Module hbm = new Hibernate4Module();
        hbm.enable(Feature.FORCE_LAZY_LOADING);
        mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
               .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.registerModule(hbm);
    }
    ...
}

有谁能看到我在这里做错了什么?

注意

我一直在遇到一些效率缺点,我正在研究在DTO之外减轻它们的可能性。我对DTO方法非常熟悉,我目前正在处理的软件包含60个名为“Ext * .java”的文件(包含使用Gson的DTO)。这些中的每一个都在100到1000行之间并且基本上增加了控制器方法的长度。此外,我们将尝试添加更多单元测试。因此,我迫切希望找到一种消除尽可能多的DTO代码的方法。也就是说,我根本不反对在需要时使用DTO,事实上我刚完成了我的第一次StdSerializer

美国大陆约有20人参与了一个项目,我只是希望能够在混乱中施加一些秩序。

1 个答案:

答案 0 :(得分:1)

这是正常的,你得到了这个例外Hibernate4Module不会让会话保持打开状态,但它并不存在。如果您希望将EntityManager / Session保持为请求作用域,则可以使用OpenEntityManagerInViewInterceptor

要在Java配置中注册,您必须添加WebMvcConfigurerAdapter类:

    @Autowired
    private EntityManagerFactory emf;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        OpenEntityManagerInViewInterceptor interceptor = new OpenEntityManagerInViewInterceptor();
        interceptor.setEntityManagerFactory(emf);
        registry.addWebRequestInterceptor(interceptor);
    }

但我不建议将其与Jackson一起用于多种原因。

首先它被称为Anti-pattern,你应该在实现它之前考虑所有的含义(连接背后的时间更长,关注分离......)。另外,根据您的JPA模型,你冒险加载所有数据库,你将不得不处理与Jackson的无限递归。

手动触发延迟加载乍一看可能看起来很痛苦,但这加上使用DTO(数据传输对象)对我来说是最持久的解决方案。