2012-01-27 2 views
0

一般的なローダーを休止状態にしようとしています。 私のビューは、オブジェクトの配列を検索し、コントローラから取得すると、コントローラはセッションを閉じます。 次に、ビューはオブジェクト情報といくつかの関係を使用する必要があります。私はLazy Loadを使用しているので、オブジェクトをロードするメソッドとメソッドによって渡された関係にあるオブジェクトを作成しようとしていますが、オブジェクトを検索すると、このオブジェクトからgetIdが呼び出されます。オブジェクトをロードさせる。しかし、getIdはブロックし、決して戻ってこない。hibernateからのリフレクションを使用してobject.getId()を呼び出します。永続的な投げ込みlazyInitializeException

方法の使用である:

LoadGeneric.load(myObjectという、Class1.class、Class2.class ...)。彼らは上の関係をHAEとあればクラス1とクラス2に持ってmyObejct そして、すべての関係は、オブジェクトがロードされなければならず、また、Class1のは、クラス2がロードされてしまう...。ここ

は、これまでの私のコードです:

public class LoadGeneric 
{ 
    private static ArrayList<Object> objs = new ArrayList<Object>(); 


    public static void load(Object objeto, Class... loadClasses) throws Exception 
    { 
     Session s = HibernateUtil.getSession(); 
     try 
     { 
      if(objeto instanceof Collection) 
      { 
       Collection lo = (Collection) objeto; 
       for(Object ob : lo) 
       { 
        Method mGetId = findGetIdMethod(ob); 
        Object mid = mGetId.invoke(ob, (Object[]) null); 
        Integer id = (Integer) mid; 
        s.get(ob.getClass(), id); 
        LoadGeneric.invokeAllMethods(ob, loadClasses);  
       } 
      } 
      else 
      { 
       Method mGetId = findGetIdMethod(objeto); 
       Object mid = mGetId.invoke(objeto, (Object[]) null); 
       Integer id = (Integer) mid; 
       s.get(objeto.getClass(), id); 
       LoadGeneric.invokeAllMethods(objeto, loadClasses);   
      } 
     } 
     finally 
     { 
      objs.clear(); 
      if(s.isOpen()) 
       s.close(); 
     } 
    } 

    //Find method like getIdNameOfTheClass 
    private static Method findGetIdMethod(Object object) throws Exception 
    { 
     Class co = object.getClass(); 
     Method[] ml = co.getDeclaredMethods(); 
     String[] name = co.getName().split("\\."); 
     String mn = "getid"+name[name.length-1]; 
     mn = mn.toLowerCase(); 
     for(Method m : ml) 
     { 
      if(m.getName().toLowerCase().contains( mn )) 
       return m; 
     } 
     throw new IllegalArgumentException("Erro ao achar método 'get id' do objeto, procurado algo como: "+mn); 
    } 

    //Find all methods that returns the class searched 
    private static List<Method> findGetObjectMethods(Object object, 
      Class searchedClass) throws Exception 
    { 
     ArrayList<Method> lm = new ArrayList<Method>(); 
     Class co = object.getClass(); 
     Method[] ml = co.getDeclaredMethods(); 
     for(Method m : ml) 
     { 
      if(m.getReturnType().equals(searchedClass)) 
       lm.add(m); 
      else if(m.getReturnType().equals(java.util.Collection.class)) 
      { 
       System.out.println("****************************COLLECTION: "+m); 
      } 
      else 
      { 
       //System.out.println("TIPO DE RETORNO DESCARTADO: "+m); 
      } 
     } 
     return lm; 
    } 


    private static void invokeAllMethods(Object object, Class... classes) throws Exception 
    { 
     ArrayList<Method> lm = new ArrayList<Method>(); 

     for(Class c : classes) 
     { 
      lm.addAll(findGetObjectMethods(object, c)); 
     } 

     for(Method m : lm) 
     { 
      System.out.println("Invocando metodo: "+m); 
      Object o = m.invoke(object, (Object[]) null); 
      if(o != null) 
      { 
       findGetIdMethod(o).invoke(o, (Object[]) null); 
       objs.add(o); 
       if(objs.contains(o)) 
        continue; 
       invokeAllMethods(o, classes); 
      } 
     } 
    } 



} 

PS:すべての私のmethod's Xクラスを返すクラスはgetIdNameOfXClass(のような名前を持っている)

EDIT:新しいコードに変更.... Imは私のget ID方式がgetIdNameOfClass_ $を見つけることができない例外を取得$ _javassist .......私は休止状態で私にpを与えると思う実際のオブジェクトの代わりにroxy、そうですか?

答えて

1

解決の問題 私がしたすべてのエンティティ

SessionImpl imp = (SessionImpl) session; 
o = imp.getPersistenceContext().unproxyAndReassociate(o); 
0

あなたのfindGetIdMethodUnknownObjectExceptionを投げていると思われます。

"getid" + class.getSimpleName() 

が本当に欲しいものをということです:あなたのコードでは、getId()ではなく、代わりに効果的であるメソッド名を探していますか? UnknownObjectExceptionは、そこに投げ込むのが少し奇妙なRMIの例外ですが、それはExceptionに拡張されているので、誰かに捕らえられているはずです。例外を適切にキャッチしてログに記録していますか?あなたのload()メソッドがそれをスローするようです。

私のような何かをするという方法を書き換えます:

co.getMethod("getId"); 

しかし、その後、再び、多分getId()メソッドの名前が何らかの理由でgetIdClassName()のようなものがあります。別のstackoverflowのポストと

+0

イムをunproxyingた申し訳ありません、コードが間違っている、と私はUnknownObjectExceptionをスローするはずの、私はその部分を修正しました。しかし、問題は、休止状態がオブジェクトの代りに私に代理を与えているということです。メソッドgetIdNameOfClass __ $$ __ javassistを見つけることができません。 – fredcrs