2011-12-16 10 views
4

エンティティpojoからHibernate固有の詳細を削除することを実験しています(例えば、シリアル化してリモートマシンに送信する必要があるとき)。その 'initializeAndUnproxy()'は、Bozhoが与えた答えの1つから取られました:Converting Hibernate proxy to real objectと私はその中で再帰的メソッドを呼び出すように変更しました。エンティティpojoからHibernateを削除しますか?

このコードに関するご意見は、その短所についてお聞きしたいと思います。例えば。そこからタイプの「PersistentSet」を削除することはありません。だからあなたはどのような改善を提案しますか?

static <T> T initializeAndUnproxy(T entity) throws IllegalArgumentException, IllegalAccessException 
{ 
    if(entity == null) 
    {   
     throw new NullPointerException("Entity passed for initialization is null");  
    } 

    Hibernate.initialize(entity);  
    T ret = entity; 

    if(entity instanceof HibernateProxy) 
    {   
     ret = (T)((HibernateProxy)entity).getHibernateLazyInitializer().getImplementation(); 
     initializeRecursively(ret);   
    } 

    return ret; 
} 

static void initializeRecursively(Object entity) throws IllegalArgumentException, IllegalAccessException 
{ 
    Class<?> clazz = entity.getClass(); 
    Field[] fields = clazz.getDeclaredFields(); 

    for(Field field : fields) 
    { 
     field.setAccessible(true);   
     Object obj = field.get(entity);      
     Hibernate.initialize(obj); 

     if(obj instanceof HibernateProxy) 
     {        
      obj = ((HibernateProxy)obj).getHibernateLazyInitializer().getImplementation(); 
      field.set(entity, obj);  
      initializeRecursively(obj); 
     }   
     if(obj instanceof LazyInitializer) 
     {      
      obj = ((LazyInitializer)obj).getImplementation(); 
      initializeRecursively(obj); 
     }      
    } 
} 

答えて

-1

私はポイントが表示されません。私が正しく

  • リモートクライアントはまだそのクラスパスにHibernateのjarファイルを持っている必要があり、
  • を理解していれば、このすべてがありませんが、再帰的に

だから、エンティティのすべてのトゥーンの関連付けを初期化することで、あなたの」コレクションの初期化されていないプロキシのために、おそらく遅延読み込みの例外が残っているでしょう。おそらく、必要以上に多くのデータをリモートクライアントに転送することになります。おそらく、すべてのtoOne関連付けとすべてのコレクションの初期化は必要ありません。そうすることで、データベースへの追加のクエリがたくさん生成されます。ビューの

私のポイントは、Hibernateに依存することができる、

  • いずれかのクライアントがしっかりサーバーに接続されているということで、Hibernateのエンティティをデタッチ使用します。そして、クライアントを初期化する必要があるものを初期化する必要があります。
  • またはクライアントが疎結合していて、Hibernateに依存していない可能性があるため、一般的なDTOを転送してエンティティをDTOに変換する必要があります。
+0

よくある点は、リモートマシンに送信するためのHibernate pojoオブジェクトのグラフ全体をシリアル化する必要があることです。そのマシンにはHibernateのjarファイルがないので、そのオブジェクトグラフからHibernateのすべてのトレースを削除する必要があります。私が示したコードはそれを行う試みですが、永続的なセットのようなものを削除しないので完全ではありません。では、このコードをどのように改善できますか? – shrini1000

+0

私が言ったように、私は、99%のケースでは、クライアントはグラフ全体を必要としないと考えています。再帰的に、オブジェクトの全体グラフを双方向の関連付けで使用すると、データベースの半分を読み込むことができます。クライアントが実際に必要なものを含むDTOを定義し、このDTOをエンティティから取り込むようにします。 –

+0

しかし、DTOは反パターンではありませんか?さらに、オブジェクトとその関連が小さい場合、それらを休止状態にしてから送信することは妥当ではありませんか? – shrini1000

1

オブジェクトのクローニングは多分ですか?シリアル化してネットワーク経由で送信するすべてのオブジェクトをクローンします。すべてのPOJOに追加のDTOクラスを持たなくても、クローンメソッドを書く必要があります

関連する問題