ola pessoal me ajudem se puder.
tenho um hibernate util
public class HibernateUtilidades {
//inicializa uma sessão como estátic que tem as configurações do Hibernate
private static SessionFactory sessionFactory;
//threads usadas para estancias apenas sessões
private static final ThreadLocal<Session> sessionThread;
//thread usadas somente para estanciar transações
private static final ThreadLocal transactionThread;
static {
try {
sessionThread = new ThreadLocal();
transactionThread = new ThreadLocal();
AnnotationConfiguration configuration = new AnnotationConfiguration();
configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
configuration.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
configuration.setProperty("hibernate.connection.url", "jdbc:mysql://IP:3306/BANCO");
configuration.setProperty("hibernate.connection.username", "username");
configuration.setProperty("hibernate.connection.password", "password");
configuration.setProperty("hibernate.order_updates", "true");
configuration.setProperty("hibernate.show_sql", "true");
configuration.setProperty("hibernate.format_sql", "true");
configuration.setProperty("hibernate.hbm2ddl.auto", "update");
for (Class clazz : getClasses("br.com.cristaltemper.eleicaocipa.pojo")) {
configuration.addAnnotatedClass(clazz);
}
sessionFactory = configuration.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
//metodo privado para varrer o diretorio das classes(addAnotationClass) e
//adicionar no contexto do hibernate
private static List<Class> getClasses(String pckgname) throws ClassNotFoundException {
List<Class> classes = new ArrayList<Class>();
ClassLoader cld = Thread.currentThread().getContextClassLoader();
String path = pckgname.replace('.', '/');
URL resource = cld.getResource(path);
File directory = new File(resource.getFile());
if (directory.exists()) {
String[] files = directory.list();
for (int i = 0; i < files.length; i++) {
if (files[i].endsWith(".class")) {
classes.add(Class.forName(pckgname + '.' + files[i].substring(0, files[i].length() - 6)));
}
}
}
return classes;
}
public static Session getSession() {
Session session = sessionFactory.openSession();
sessionThread.set(session);
return session;
}
public static void closeSession() {
Session session = (Session) sessionThread.get();
if (session != null && session.isOpen()) {
session.flush();
session.close();
}
sessionThread.set(null);
}
public static void beginTransaction() {
Transaction transaction = sessionThread.get().beginTransaction();
transactionThread.set(transaction);
}
public static void commitTransaction() {
Transaction transaction = (Transaction) transactionThread.get();
if (transaction != null && !transaction.wasCommitted() && !transaction.wasRolledBack()) {
transaction.commit();
transactionThread.set(null);
}
}
public static void rollbackTransaction() {
Transaction transaction = (Transaction) transactionThread.get();
if (transaction != null && !transaction.wasCommitted() && !transaction.wasRolledBack()) {
transaction.rollback();
transactionThread.set(null);
}
}
}
tenho um DAO generico
public abstract class GenericDAO {
protected static Session session = null;
public GenericDAO() {
}
public List list(Class clazz) {
session = HibernateUtil.getSession();
List lista = session.createCriteria(clazz).list();
HibernateUtil.closeSession();
return lista;
}
tenho uma classe que tem relacionamentos com outras e as outras tem relacionamento com mais outras e etc…
o problema é que quando tento listar uma classe que tem relacionamentos da varios problemas pois a sessão esta fechada. Quando comento o closesession do metodo list ai funciona! quando fechar a sessão realmente então?