Hibernate no JBOSS

4 respostas
smota

Olás …

Preciso de uma ajuda pra usar o Hibernate em um projeto J2EE …

Para iniciar a conexão tenho: SessionFactory sf; sf = (SessionFactory) new InitialContext().lookup("comp/env/hibernate/SessionFactory"); s = sf.openSession(); session.set(s); connection = (Object) s;

O hibernate.properties que está no meu classpath tem a propriedade hibernate.session_factory_name comp/env/hibernate/SessionFactory

Mas mesmo assim no lookup() eu tenho uma NamingException

:arrow: Como fazer a conexao (iniciar a sessao do hibernate) ? :cry:

Nao quero fazer via código setando meu .hbm & cia como neste artigo

Como vcs tem feito?

Obrigado

4 Respostas

smota

Pra refrescar a memoria do povo (alguem ajuda?) :o

Atualmente tenho o seguinte código dentro da minha DAOFactory:
protected Object connection = null;
public static final ThreadLocal session = new ThreadLocal();

	protected void connect() throws InvalidConnection {
		Session s = (Session) session.get();
		SessionFactory sf;
		//sf = (SessionFactory) new InitialContext().lookup("comp/env/hibernate/SessionFactory");
		Configuration cfg = new Configuration();
		try {
			cfg.addClass(User.class);
			sf = cfg.buildSessionFactory();
			if (s == null) {
				s = sf.openSession();
			} else {
				if(!s.isConnected())
					s = sf.openSession();
			}
		} catch (MappingException e) {
			LOG.error("[OracleDAOFactory.class] connect()", e);
			throw new InvalidConnection();
		} catch (HibernateException e) {
			LOG.error("[OracleDAOFactory.class] connect()", e);
			throw new InvalidConnection();
		}
		
		session.set(s);
		connection = (Object) s;
	}

Ta ruim demais porque [list]*A configuração tem que ser na munheca colocando quais sao as classes (ex: User.class) do Hibernate
*É muito lento ler em cada action toda a configuracao de novo[/list]
Entao eu continuo com a pergunta ai de cima e acrescento ... é seguro (em perfomance e tudo mais) eu colocar o objeto de configuração no scopo da aplicação?

Valeus ...

urubatan

mas não se deve ler toda a configuração novamente em cada action
o mais correto e normal de se utilizar, é inicializar a SessionFactory uma vez para o sistema todo e depois pegar uma session desta SessionFactory para cada action

smota

Urubatan, pessoal ... uma ajudinha com esse negocio que eu acho que to começando a dar nó :cry: (vou juntar com este tópico)

O que eu fiz: :arrow: Na minha DAOFactory tenho um objeto de conexão local. Que é criado sempre por uma action pra pegar os DAOs com o seguinte código:
try {
			LocalSessionFactory sessionFactory = new LocalSessionFactory();
			connection = (Object) sessionFactory.getSession();
		} catch (HibernateException e) {
			LOG.error("[OracleDAOFactory.class] connect()", e);
		};
A minha classe LocalSessionFactory tem como ideia criar a SessionFactory e Configuration estáticos pra ser usado depois ...
public class LocalSessionFactory {
	private static Configuration cfg=null;
	private static SessionFactory sf=null;  
	
	public LocalSessionFactory() 
		throws MappingException, HibernateException 
	{
		if(cfg==null || sf==null) {
			cfg = new Configuration();
			cfg.addClass(User.class);
			sf = cfg.buildSessionFactory();	
		}
	}	
	
	public Session getSession() 
		throws HibernateException 
	{ 
		return sf.openSession();
	}
	
}

Funciona que é uma beleza, na primeira execucao demora um pouco pq ta carregando as configuracoes, depois vai rapidim os selects ...

Mas o problema é que depois de submeter umas 3 vezes dá uma exception se como a conexão tivesse sido perdida, se eu voltar e submeter de novo ele carrega novamente a configuração & cia.

:arrow: Como fazer corretamente? :?:

A exception

"Apache Tomcat/4.1.27 Error Report":
java.lang.NullPointerException
at oracle.jdbc.driver.OraclePreparedStatement.setString(OraclePreparedStatement.java:1132)
at net.sf.hibernate.type.StringType.set(StringType.java:22)
at net.sf.hibernate.type.NullableType.nullSafeSet(NullableType.java:46)
at net.sf.hibernate.type.NullableType.nullSafeSet(NullableType.java:31)
at net.sf.hibernate.loader.Loader.prepareQueryStatement(Loader.java:494)
at net.sf.hibernate.loader.Loader.doFind(Loader.java:136)
at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:587)
at net.sf.hibernate.loader.EntityLoader.load(EntityLoader.java:42)
at net.sf.hibernate.persister.EntityPersister.load(EntityPersister.java:396)
at net.sf.hibernate.impl.SessionImpl.doLoad(SessionImpl.java:1889)
at net.sf.hibernate.impl.SessionImpl.doLoadByClass(SessionImpl.java:1757)
at net.sf.hibernate.impl.SessionImpl.load(SessionImpl.java:1688)
at br.com.netset.netwalki.database.UserDAOOracleImpl.findUser(UserDAOOracleImpl.java:26)
at br.com.netset.netwalki.actions.UserLogin.execute(UserLogin.java:73)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:152)
at com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor.intercept(DefaultWorkflowInterceptor.java:58)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:149)
at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:37)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:149)
at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:37)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:149)
at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:37)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:149)
at com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:121)
at com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:165)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

urubatan

uma dica, inicializa o teu LocalSessionFactory uma vez só para o sistema todo, e depois da só os getSession

o hibernate tem um grande problema, que esta na documentação como funcionamento normal do bagulho

depois que der qualquer erro em uma session tu tem que dar um rollback na transação e criar outra sessção (sessionFactory.getSession)

agora quanto ao erro que ta dando ai, pode ser o numero de conexões no banco, ja que tu ta criando um monte de sessionFactory

mas para ter certeza, em que parte do codigo exatamente ocorre o erro??
pelo trace, parece que tu ta chamando o metodo load (para carregar uma instancia de um objeto) com um parametro null, o que não pode ser feito, ja que a PK nunca pode ser null

uma possibilidade para isto, é tu encerrar uma sessão e depois ler uma propriedade de um objeto que foi carregado por esta sessão, e não foi chamado o evict para este objeto

Criado 24 de setembro de 2003
Ultima resposta 25 de set. de 2003
Respostas 4
Participantes 2