Я пытаюсь сделать универсальный загрузчик в спящий режим, вот в чем проблема.
Мой взгляд ищет массив объектов и получает его от контроллера, контроллер закрывает сессию.
Затем представление должно использовать информацию об объекте (-ах) и некоторые отношения. Так как я использую Lazy Load, я пытаюсь создать метод, который загружает объект и объекты, находящиеся в отношениях, передаваемых методом, дело в том, что когда я нахожу объект, который ищу, я вызываю getId из этого объекта в Чтобы сделать объект для загрузки. Но getId блокируется и никогда не возвращается.
Использование метода:
LoadGeneric.load (myObject, Class1.class, Class2.class ...);
И все отношения, которые myObejct имеет с Class1 и Class2, будут иметь загруженные объекты, также Class1, будет иметь загруженный Class2, если они имеют отношения и так далее ...
Вот мой код:
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: все классы моего метода, которые возвращают класс X, имеют имя, подобное getIdNameOfXClass ()
РЕДАКТИРОВАТЬ: Изменено на новый код .... Я получаю исключения, что мой метод get id не может найти getIdNameOfClass_ $$ _javassist ....... Я думаю, что Hibernate дает мне прокси вместо реальный объект, верно?