Вызов метода object.getId () с использованием отражения от спящего броска в спящем режиме lazyInitializeException - PullRequest
0 голосов
/ 27 января 2012

Я пытаюсь сделать универсальный загрузчик в спящий режим, вот в чем проблема. Мой взгляд ищет массив объектов и получает его от контроллера, контроллер закрывает сессию. Затем представление должно использовать информацию об объекте (-ах) и некоторые отношения. Так как я использую 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 дает мне прокси вместо реальный объект, верно?

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Решена проблема с другим сообщением stackoverflow все, что я сделал, это отменил сущность

SessionImpl imp = (SessionImpl) session;
o = imp.getPersistenceContext().unproxyAndReassociate(o);
0 голосов
/ 27 января 2012

Я подозреваю, что ваш findGetIdMethod выбрасывает UnknownObjectException.В вашем коде вы ищете имя метода, которое не getId(), а вместо этого эффективно:

"getid" + class.getSimpleName()

Это действительно то, что вы хотите?UnknownObjectException - это исключение RMI, которое немного странно выбрасывать, но оно распространяется на Exception, поэтому, должно быть, кто-то его поймал.Правильно ли вы ловите исключения и регистрируете их?Похоже, что ваш load() метод выбросит это.

Я бы переписал этот метод, чтобы сделать что-то вроде:

co.getMethod("getId");

Но опять же, возможно, имя метода getId()что-то вроде getIdClassName() по какой-то причине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...