Sol

com.sun.jdi.InvocationException no es necesariamente culpa de Hibernate

Com Sun Jdi Invocationexception Is Not Necessarily Hibernates Fault

En la subclase de HibernateDaoSupport, existe la siguiente declaración: List retValue = getHibernateTemplate (). Find ('from ViewAttachAuth donde 1 = 1'), donde ViewAttachAuth es un objeto de entidad personalizado, mapeado a una vista en la base de datos, es razonable para decir que retValue debería ser un objeto de tipo ArrayList, y cada elemento en retValue es un objeto ViewAttachAuth, pero cuando depuro, encontré que el método toString () del objeto devuelto realmente obtuvo 'com.sun.jdi.InvocationException ocurrió método de invocación. ', y el método toString del objeto ArrayList ordinario obviamente no es el mismo, pero si lo usa como una interfaz List para usarlo, no habrá ningún problema, y ​​si System.out.println (retValue) entonces java.lang. StackOverflowError error de desbordamiento de pila, lo que hace que el programa se bloquee. Publicaciones completas relacionadas en línea y su propia experiencia con Hibernate concluyeron preliminarmente que este fenómeno está relacionado con la caché de Hibernate y la estrategia de carga diferida, pero no hay muchos registros en la vista correspondientes a ViewAttachAuth, solo cuatro o cinco, en el caso de una la cantidad de datos. Hibernate no iniciará la caché de segundo nivel, parece que todavía es una buena idea pensar en lo que está sucediendo.

En los próximos minutos, siempre hay una cadena en mi mente: toString, que no es un problema con el método de toString en sí. De acuerdo con esta idea, verifiqué mi propia clase de entidad ViewAttachAuth y descubrí que su método toString se define de la siguiente manera.



|_+_|

Así que intenté cambiarlo a lo siguiente:



|_+_|

Desafortunadamente (^ _ ^), el problema está resuelto. Así que no pude evitar querer ver el código fuente de org.apache.commons.lang.ObjectUtils.toString (Object obj) y ver qué magia dentro de él causó que mi programa fallara. La siguiente escena me dejó atónito, a continuación se muestra el fragmento de origen del método toString en ObjectUtils:



|_+_|

No es sorprendente ver que mi método toString original puede hacer que un programa se bloquee: ¡es un bucle infinito! ¡El enemigo del programador!