Galera, tenho umas duvidas com relação ao Hibernate.
Alguem aí tem um exemplo de como eu deveria fazer para gravar um objeto no banco que tenha chave Fk, tipo, tenho o Classe conta q tem o Objeto Usuario. Vou cadastrar uma conta, eu seto os dados da conta, os dados do Usuario e seto o Usuario na conta e dou um save? alguem tem algum exemplo? Outra coisa, o hibernate faz algum tipo de controle de concorrencia?
Olha só galera, tah complicado mexer com esse tal de Hibernate. Seguinte…
-> tenho a classe HibernateUtility que circula pelo GUJ ai blz
-> tenho uma classe que chamad os metodos para gravar, atualziar, deletar e consultar
mas estou com problemas na hora de gravar/atualizar. O código do HibernateUtility está assim:
package jfinances.model.dao;
//~--- non-JDK imports --------------------------------------------------------
import javax.naming.ConfigurationException;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
//~--- classes ----------------------------------------------------------------
public class HibernateUtility
{
private static final ThreadLocal<Session> threadSession =
new ThreadLocal<Session>()
{
@Override protected Session initialValue ()
{
return sessionFactory.openSession ();
}
};
protected static final SessionFactory sessionFactory;
//~--- static initializers ------------------------------------------------
static
{
try
{
Configuration cfg = new Configuration ();
sessionFactory = cfg.configure ().buildSessionFactory ();
}
catch (Throwable ex)
{
// Make sure you log the exception, as it might be swallowed
System.err.println ("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError (ex);
}
}
//~--- methods ------------------------------------------------------------
/**
* Inicia uma transação na sessão do thread atual.
*/
public static Transaction beginTransaction () throws HibernateException
{
return getSessaoDoThread ().beginTransaction ();
}
/**
* Faz commit na transação passada.
*/
public static void commitTransaction (Transaction trans)
throws HibernateException
{
try
{
if ((trans != null) &&!trans.wasCommitted ()
&&!trans.wasRolledBack ())
{
trans.commit ();
}
}
catch (HibernateException ex)
{
rollbackTransaction (trans);
throw new HibernateException (ex.getMessage ());
}
}
/**
* Desconecta a sessao do thread atual.
*/
public static void desconectarSessao ()
{
Session session = threadSession.get ();
if (session != null)
{
if (session.isConnected () && session.isOpen ())
{
session.disconnect ();
}
}
}
/**
* Fecha sessão associada ao thread atual.
*/
public static void fecharSessao () throws HibernateException
{
Session s = threadSession.get ();
threadSession.set (null);
if ((s != null) && s.isOpen ())
{
s.close ();
}
}
/**
* Reconecta a sessao do hibernate do thread atual.
*/
public static void reconectar ()
{
Session session = threadSession.get ();
if (session != null)
{
if (!session.isConnected ())
{
session.reconnect ();
}
}
}
/**
* Faz rollback na transação.
*/
public static void rollbackTransaction (Transaction trans)
throws HibernateException
{
try
{
if ((trans != null) &&!trans.wasCommitted ()
&&!trans.wasRolledBack ())
{
trans.rollback ();
}
}
catch (HibernateException ex)
{
throw new HibernateException (ex.getMessage ());
}
finally
{
fecharSessao ();
}
}
//~--- get methods --------------------------------------------------------
public static Session getSessaoDoThread () throws HibernateException
{
Session s = threadSession.get ();
if (s == null)
{
s = sessionFactory.openSession ();
threadSession.set (s);
}
System.err.println (s.toString ());
return s;
}
/**
* @return Abre uma nova sessão do hibernate.
* @throws HibernateException
*/
public static Session getSession () throws HibernateException
{
Session session = null;
try
{
session = sessionFactory.openSession ();
}
catch (HibernateException e)
{
throw new HibernateException ("Erro ao iniciar sessao: "
+ e.getMessage ());
}
finally
{
return session;
}
}
}
como q funciona essas sessões? tipo, se eu chamo getSessaoDoThread ele me retorna a sessao local do thread certo, ai quando eu faço a consulta ele me retorna os dados certinho, mas na consulta eu tava fechando a sessao, ai quando eu ia consultar registros com chave estrangeria dizia q eu estava com a sessao fechada. Ai eu tirei o local q fecha a sessao da consulta e mostra certo novamente. Ai quando eu ia alterar/cadastar eu chamava o getSessao que abre uma nova sessao ai grava no banco, mas quando eu ia consultar q usava a sessao do thread os dados eram os anteriores mesmo fazendo a consulta, se eu fechasse o programa e abrisse novamente ai parecia certo. Dai entao eu deixei pegando sempre a sessao do thread e nao to fechando mais a sessao. Mas, nao creio q isso seja o correto. E olha soh, eu tb tive q adicionar o comando getSessaoDoThread ().clear (); para listar certo. Alguem poderia me explicar melhor como isso funciona?
Para o controle da concorrência vc pode utilizar um campo na tabela que representa a versao, o hibernate se encarregará de checar quando for atualizado e levantará uma exception caso alguém atualize em uma versão errada: