2017-10-30 5 views
0

.sizeを手動でフィールドをロードするのを避けるため、Hibernate4Moduleを実装したいと思います。残念なことに、すべての設定で新しくなって、私はそれを動作させるように見えません。私がjavaから手に入れているのは、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); 
    } 
    ... 
} 

誰でも私がここで間違っているのを見ることができますか?

NOTE

私は、効率の欠点のいくつかに実行されている、と私は、DTOの外でそれらを軽減するfesablityに探しています。私は現在DTOメソッドに精通しています。私が現在取り組んでいるソフトウェアには、 "Ext * .java"という名前の60個のファイル(Gsonを使ってDTOを含む)が含まれています。これらはそれぞれ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クラスに追加する必要がありますJava設定に登録するには

最初にAnti-patternとして知られていますが、実装する前に実際にすべての意味を考慮する必要があります(接続が長く続いて、分離の破損...)。さらに、JPAモデルに応じてすべてのデータベースをロードするリスクがあり、ジャクソンと無限に再帰的に対処する必要があります。

Lazy-loadingを手動でトリガするのは一目でわかりにくいかもしれませんが、これに加えてDTO(データ転送オブジェクト)を使用することが最も耐久性のあるソリューションです。

+0

fantastic!私はそれを試してみる必要があります。 – chrisgotter

+0

私たちのアプリケーションでは、ormを使用できないようです。だから行きましょう。とにかく良い答え。 – chrisgotter