一般的なローダーを休止状態にしようとしています。 私のビューは、オブジェクトの配列を検索し、コントローラから取得すると、コントローラはセッションを閉じます。 次に、ビューはオブジェクト情報といくつかの関係を使用する必要があります。私は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、そうですか?
イムをunproxyingた申し訳ありません、コードが間違っている、と私はUnknownObjectExceptionをスローするはずの、私はその部分を修正しました。しかし、問題は、休止状態がオブジェクトの代りに私に代理を与えているということです。メソッドgetIdNameOfClass __ $$ __ javassistを見つけることができません。 – fredcrs