【问题标题】:How to use Hibernate4Module如何使用 Hibernate4Module
【发布时间】:2018-04-11 21:33:01
【问题描述】:

为了避免使用.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 人正在开展一个项目,我只是希望能够为混乱带来一些秩序。

【问题讨论】:

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


    【解决方案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);
        }
    

    但出于多种原因,我不建议将它与杰克逊一起使用。

    首先它被称为Anti-pattern,在实施它之前您应该真正考虑所有含义(连接延迟保持更长时间,关注分离的中断......)。此外,您还要冒着根据 JPA 模型加载所有数据库的风险,并且您必须使用 Jackson 处理无限递归。

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

    【讨论】:

    • 太棒了!我将不得不尝试一下。
    • 好吧,看来我们不能在我们的应用程序中使用 orm。所以不行。无论如何都是好答案。
    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2012-02-29
    相关资源
    最近更新 更多