Hi!
Ok... probiers mal nach Schema F: Auf die Session kommst du am besten mit einer Util-Klasse die in etwa folgendermaßen aussieht
Code:
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory
Configuration configuration = (new
Configuration()).configure();
sessionFactory = configuration.buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
ex.printStackTrace();
throw new ExceptionInInitializerError(ex);
}
}
public static final ThreadLocal session = new ThreadLocal();
/**
* returns current session using thread-local
* @return
* @throws HibernateException
*/
public static Session currentSession() throws HibernateException {
org.hibernate.Session s = (org.hibernate.Session) session.get();
// // Open a new Session, if this Thread has none yet
if (s == null || !s.isOpen()) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
if (s != null && s.isOpen()) {
s.close();
s = null;
}
}
/**
* returns the current session using sessionfactory
* @return
*/
public static Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
public static void closeSessionFactory(){
sessionFactory.close();
}
public static boolean isOpenSession(){
return ((org.hibernate.Session)session.get())!=null &&
((org.hibernate.Session)session.get()).isOpen() ;
}
}
Mit HibernateUtil.getCurrentSession() erhältst du dann immer die selbe Session. Und... naja... normalerweise (wenn das mit HibernateUtil in deinen JUnit funktionniert) müsst' es genauso in deinen Backing-Beans funktionieren.
Allerdings würde ich davon abraten, dass du direkt in deien BBeans Hibernate-Code schreibst. Lieber eine Schicht von DAOs dazwischen. Also zB eine Klasse:
public class EmployeeDao{
public List<Project> getProjects(Employee e){
Session sess = HibernateUtil.getCurrentSession();
Transaction tx = sess.beginTransaction();
List<Project> res = e.getProjects();
tx.commit();
HibernateUtil.closeSessionFactory();
return res;
}
public int getNumEmployees(){
// usw usf
}
...
}
Dann brauchst du dich in deinen JSF-Klassen um das Session-Handling nicht mehr bemühen.
Gruß
Harald