he encontrado raro condición de mi hibernación programa. Aquí está mi código

public Set<AnotherClass> getAnotherClassSetsFromSomeClass() {
        Session session = HIbernateUtil.getSessionFactory().openSession();
        Transaction trans = session.beginTransaction();
        SomeClass sc = (SomeClass)session.get(SomeClass.class,"classId");
        trans.commit();
        session.close;
        return sc.getAnotherClassSet();
    }

Este código mirando bien, si lo ejecuto en la Consola de Java.

Si estoy utilizó una aplicación web (JSF),tengo este error

no pudo perezosamente inicializar – no hay ninguna sesión o la sesión se cerró

Tiene de Uno a Muchos Relación (Uno SomeClass tiene Muchos AnotherClass)

El mensaje de excepción señalado para volver sc.getAnotherClassSet() como un puntero nulo. Estoy seguro de que tengo datos en mi base de datos.

Bien me di cuenta que si puedo agregar System.out.println(sc.getAnotherClassSet()) berfore return sc.getAnotherClassSet() mi código está funcionando bien.

Alguna idea de lo que pasó ? Gracias.

InformationsquelleAutor Aldo Suwandi | 2013-08-07

2 Comentarios

  1. 5

    Probablemente, su @OneToMany asociación se asigna con fetchType="lazy" (tal vez de forma predeterminada). Esto significa que la asociación, en su caso AnotherClassSet, no se carga cuando se carga la entidad SomeClass. Es sólo se cargan cuando se intenta acceder a ella, mediante getAnotherClassSet().

    Sin embargo, en el ejemplo, este método (getAnotherClassSet()) se llama en la return declaración, después de la sesión fue cerrada.

    Para resolver este problema, puede intentar invocar getAnotherClassSet() antes de cerrar la sesión, solo para cargar el AnotherClassSet asociación.

    • Esta es la respuesta, pero en lugar de invocar getter o setter, mejor utilizar el atributo class con alguna función, como getAnotherClassSet().size() y se cargan a AnotherClassSet en SomeClass. Gracias
    • Sí, la carga de la AnotherClassSet (asociación de SomeClass) es lo que he tratado de sugerir en el último párrafo de mi respuesta 😉
  2. 1

    Porque usted está usando lazy initialization(que es la configuración predeterminada). En lazy initialization, cada una de las colecciones de campo se captura sólo bajo petición. Usted tiene que especificar la inicialización como eager, para que el código funcione. Eager initialization recupera el objeto en su totalidad en una sola búsqueda.

    • puede usted explicar por qué si puedo agregar Sistema.a cabo.println() antes de regresar, mi código de trabajo ?
    • Después de la sesión de clausura, es decir,session.close(), no se puede recuperar nada.

Dejar respuesta

Please enter your comment!
Please enter your name here