2017-10-30 3 views
0

.size을 수동으로 필드를로드하는 것을 피하기 위해 Hibernate4Module을 구현하고 싶습니다. 불행히도, 모든 것을 구성하는 것에 새로운 것이므로, 나는 그것을 작동시키는 것처럼 보이지 않습니다. 내가 자바에서 계속 얻는 것은 : Could not write content: could not initialize proxy - no Session입니다.Hibernate4Module 사용법

@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의 외부를 완화의 fesablity으로 찾고 있어요. 나는 DTO 메소드에 매우 익숙하다. 내가 현재 작업하고있는 소프트웨어는 "Ext * .java"(Gson을 사용하여 DTO를 포함하고있다)라는 60 개의 파일을 포함하고있다. 이들 각각은 100 줄과 1000 줄 사이에 있으며 컨트롤러 방법의 길이를 실질적으로 늘립니다. 또한 단위 테스트를 더 추가하려고합니다. 결과적으로 가능한 한 많은 DTO 코드를 제거하는 방법을 찾기를 절박합니다. 즉, 나는 DTO를 사용할 필요가 없을 때 전혀 반대하지 않는다. 실제로 나는 처음으로 끝냈다. StdSerializer.

대륙을 통틀어 약 20 명이 프로젝트를 진행 중이므로 혼돈에 어떤 명령을 내릴 수 있기를 바라고 있습니다.

답변

1

예외가 있으니 Hibernate4Module은 세션을 계속 열어 두지 않을 것입니다. 요청 범위로 EntityManager/Session을 열어 두려면 OpenEntityManagerInViewInterceptor을 사용할 수 있습니다.

@Autowired 
    private EntityManagerFactory emf; 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 

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

하지만 난 여러 가지 이유로 잭슨과 사용을 권장하지 것이다 :

자바 구성에 등록하려면 당신은 WebMvcConfigurerAdapter 클래스에 추가해야합니다.

처음에는 Anti-pattern으로 알려져 있습니다. 구현하기 전에 모든 의미에 대해 실제로 생각해야합니다. (더 오래 뒤에있는 연결, 우려의 분리 ...). 또한 JPA 모델에 따라 모든 데이터베이스를로드하는 위험을 감수해야하며 Jackson과 함께 무한 재귀를 처리해야합니다.

수동으로 지연로드를 트리거링하는 것은 처음에는 힘들어 보일 수 있지만 DTO (데이터 전송 객체)를 사용하면 가장 내구성이 뛰어난 솔루션입니다.

+0

환상적! 나는 그것을 시험해야 할 것이다. – chrisgotter

+0

글쎄, 우리는 우리 응용 프로그램에서 orm을 사용할 수없는 것 같습니다. 그래서 안돼. 어쨌든 좋은 답변입니다. – chrisgotter