Hakan: Sessionhandling in Hibernate

Hallo Leute,

1. Problem:

nun mal eine grundlegende Frage bzgl. Session Handling mit Hibernate.

Ich benutze in meiner Anwendung Hibernate und bentuze die folgende Klasse, dass ich in einem Tutorial gefunden habe:

public class HibernateUtil {
  private static SessionFactory sessionFactory;

// disable contructor to guaranty a single instance
  private HibernateUtil() {
  }

static{
    try {
      // SessionFactroy erstellen aus hibernate.cfg.xml
      sessionFactory =
        new Configuration().configure().buildSessionFactory();

} catch (Throwable ex) {
// Exception loggen
System.err.println("Initial SessionFactory creation failed: "+ex);
throw new ExceptionInInitializerError(ex);
    }
  }

public static SessionFactory getSessionFactory(){
    return sessionFactory;
  }

public static void close(){
    if (sessionFactory != null)
      sessionFactory.close();

sessionFactory = null;
  }

public static Session getSession(){
    // Transaktion beginnen und Session erstellen
    Session session =
         HibernateUtil.getSessionFactory().getCurrentSession();

if(!session.getTransaction().isActive()){
      session.beginTransaction();
    }

return session;
  }

}

Mein Problem nun....
Sobald ich mein UserCheck beim Login mache, funktioniert alles wunderbar. Ich bekomme eine Session und arbeite damit.

Dann logge ich mich aus und die Methode close() aus der oberen Klasse wird ausgeführt. Auch wunderbar!

Nun gehe ich wieder auf der Loginmaske (ohne den WebSerer neu zu starten) und logge mich wieder ein und siehe da.....ich habe keine Session mehr und kann UserCheck nicht ausführen.

Wie geht man damit vernünftig um?
Muss zugeben, was Sessionhandling angeht bin ich noch relativ ein newbie.

Bin also für jede Info und Infoseite dankbar (auch gerne englische Seiten!)

2. Problem:

Wenn man bei mir auf Logout klickt, gelangt man auf die folgende Bean-Methode:

public String doLogout(){
  HibernateUtil.close();
  userClass = null;
  return "./index.html?faces-redirect=true";
}

Aber irgendwie gelang ich nicht auf die index.html (der Pfad stimmt!) Es wird überhaupt keine neue Seite geladen. Keine Fehlermeldung, garnichts! Aber debuggen kann ich...wie gesagt, läuft alles durch, aber ohne Weiterleitung...warum????

Danke für die Antworten!

Gruß, Hakan

  1. Tach,

    Dann logge ich mich aus und die Methode close() aus der oberen Klasse wird ausgeführt. Auch wunderbar!

    deine close-Methode schließt die SessionFactory, du willst aber eigentlich nur die session schließen.

    Aber irgendwie gelang ich nicht auf die index.html (der Pfad stimmt!) Es wird überhaupt keine neue Seite geladen. Keine Fehlermeldung, garnichts! Aber debuggen kann ich...wie gesagt, läuft alles durch, aber ohne Weiterleitung...warum????

    Was stellst du mit dem String, den du da zurückgibst denn an?

    mfg
    Woodfighter

    1. deine close-Methode schließt die SessionFactory, du willst aber eigentlich nur die session schließen.

      public static void closeSession(){
          //Transaktion beginnen und Session erstellen
          Session session = PriOFFUtil.getSessionFactory().getCurrentSession();

      if(session.getTransaction().isActive()){
            session.getTransaction().commit();
            session.clear();
            session.close();
            session = null;
          }
      }

      Hab nun die closeSession() Methode wie oben geändert. Das hat aber überhaupt keine Wirkung. Das heißt, ich kann, nachdem ich Logout geklickt habe und die obere Methode durchgelaufen ist, einfach weiter arbeiten. Als wäre die Session immer noch voll da....ist sie auch.
      Was mach ich falsch....sitz ich wirklich so derb auf der Leitung?

      Was stellst du mit dem String, den du da zurückgibst denn an?

      Einfach in eine <h:commandLink /> eingebettet:
      <h:commandLink action="#{loginBean.doLogout}" target="_top" styleClass="label12" value="Logout" />

      1. Hi,

        Hab nun die closeSession() Methode wie oben geändert. Das hat aber überhaupt keine Wirkung.

        Die Befehle stehen innerhalb eines bedingten Anweisungsblockes.
        Hast du also *überprüft*, ob dieser auch durchlaufen wird ...?

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Ja, hast Recht. Die werden darin nicht durchlaufen. Aber selbst wenn ich die aus dem if-Block herausnehme und session.close()+session=null; durchlaufen wird, ändert sich nichts.

          Der Link funktioniert ja nicht, so dass ich auf die index.html komme. Also muss ich manuell wieder die index.html ansteuern. Selbst wenn ich mich nun mit einem anderen User einlogge, erhalte ich die alte Session wieder. Also die Daten vom ersten User werden geladen.

          1. Hi,

            Der Link funktioniert ja nicht, so dass ich auf die index.html komme.

            Welcher Link?

            Also muss ich manuell wieder die index.html ansteuern. Selbst wenn ich mich nun mit einem anderen User einlogge, erhalte ich die alte Session wieder. Also die Daten vom ersten User werden geladen.

            Werden sie wirklich geladen - oder zeigt dir dein Browser einfach eine alte Version des Dokumentes aus dem Cache an?

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
            1. Der Link funktioniert ja nicht, so dass ich auf die index.html komme.

              Also, ich habe ein commandLink in dem die folgende Bean-Methode aufgerufen wird
              public String doLogout(){

              	// Hat alles irgendwie keine Wirkung  
              	HibernateUtil.closeSession();  
              	this.setUserClass(null);  
              	  
              	return "./index.html?faces-redirect=true";  
              }  
              

              die Methode HibernateUtil.closeSession() habe ich jetzt wie folgt:

              public static void closeSession(){
                  Session session = PriOFFUtil.getSessionFactory().getCurrentSession();

              if(session.getTransaction().isActive()){
                    session.getTransaction().commit();
                  }

              session.close();
                  System.out.println("Sessionstatus: " + session.isOpen());

              }

              Auf der console wird ausgegegeben "Sessionstatus: false" - sprich, die Session ist weg!

              Der Link mit der return-anweisung funktioniert leider nicht. Das heißt, es wird garnicht verzweigt, aber die Methoden werden wirklich durchlaufen.

              Jedenfalls lösche ich dann den Cache aus meinem Browser, melde mich mit dem zweiten User an und ich habe immer noch dei Daten des ersten Users.

              Leider! Verzweifle schon.

              1. NIcht verunsichern lassen wegen dem EIntrag
                Session session = PriOFFUtil.getSessionFactory().getCurrentSession();

                HibernateUtil und PriOFFUtil ist das selbe. Die Anwendung heißt Prioff und ich habe nur für das FOrum hier prioff in hibernate geändert. Damit sich keiner die Frage stellen muss, was prioff ist.

                Gruß, Hakan

              2. Hi,

                Jedenfalls lösche ich dann den Cache aus meinem Browser, melde mich mit dem zweiten User an und ich habe immer noch dei Daten des ersten Users.

                Dann debugge mal ein bisschen an der Stelle, wo du die Daten lädst.
                Wie sieht es da aus mit der Session - wird eine neue ID(?) generiert, wird der Code zum Laden der Daten tatsächlich ausgeführt, oder wird auf eine andere Quelle zurückgegriffen, etc.

                MfG ChrisB

                --
                RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. Hi,

    nur zur Klärung, du verwechselst nicht zufällig (z.B.) http://download.oracle.com/javaee/5/api/javax/servlet/http/HttpSession.html mit der hibernate session?

    Hth