Olá amigos,
Dúvida cruel…
-
Estou construindo uma aplicação web utilizando JSF e Hibernate no conteiner Tomcat, e no entando, algumas dúvidas surgiram e acho que é a de vários outros iniciantes como eu.
-
Para a aplicação que estou construindo, será necessário uma conexão por usuário, ou seja, cada usuário deverá logar com seu id e senha respectivamente.
-
Em função disso, procurei construir uma classe para conexão com o banco de dados utilizando o Hibernate como demonstrado abaixo:
package demo;
import java.util.Properties;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateHelper {
/**
* Reference to SessionFactory.
*/
private static SessionFactory sf;
public static final ThreadLocal session = new ThreadLocal();
public static synchronized void init() {
if (sf != null)
return;
System.out.println("Initializing Hibernate");
try {
Configuration cfg = new Configuration().configure();
Properties p = new Properties();
p = cfg.getProperties();
p.setProperty( "hibernate.connection.username", "root" );
p.setProperty( "hibernate.connection.password", "1234" );
cfg.setProperties(p);
//Configuration conf = new Configuration().setProperties( p );
sf = cfg.buildSessionFactory();
} catch (Exception he) {
System.err.println("Unable to create session factory from configuration");
he.printStackTrace();
throw new RuntimeException("Unable to create session factory from configuration", he);
}
System.out.println("Hibernate initialized");
}
/**
* Return the SessionFactory.
* @return The SessionFactory for this application session
*/
public static SessionFactory sessionFactory() {
if (sf == null)
init();
return sf;
}
public static void destroy() {
if (sf != null) {
try {
sf.close();
} catch (HibernateException he) {
he.printStackTrace();
}
}
sf = null;
System.out.println("Hibernate resources released");
}
/**
* Closes an hibernate {@link Session}, releasing its resources.
* @throws HibernateException if an hibernate error occurs
*/
public static void closeSession() throws HibernateException {
Session s = (Session)session.get();
session.set(null);
if (s != null) {
s.close();
}
}
/**
* Returns an hibernate {@link Session} from the session factory.
* @return an hibernate {@link Session}
* @throws HibernateException if an error occurs
*/
public static Session openSession() throws HibernateException {
if (sf == null)
init();
Session s = (Session)session.get();
if (s == null) {
s = sf.openSession();
session.set(s);
}
return (s);
}
}
-
Esta classe irá criar uma session factory por aplicação e compartilhará a mesma com todas as outras sessions que forem solicitadas (me corrijam se eu estiver errado).
-
Cada conexão (Requisição) com o banco utilizará a mesma session factory.
-
Eu preciso fazer minha classe criar uma session factory independente por sessão (httpsession) do usuário (onde cada um entrará com seu id e senha), para ai sim compartilhar a mesma com as sessions da sessão criada pelo usuário.
-
Não sei se consegui me expressar adequadamente, porém, gostaria da ajuda dos “feras” da comunidade no sentido de exclarecer e colocar suas opiniões sobre o assunto, tenho certeza de que outros se beneficiarão da colaboração de todos vocês.
-
Agradeço desde já,
jukinha :!: