Dúvidas Hibernate

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?

Desde já muito obrigado!

Exemplos:
http://www.hibernate.org/hib_docs/v3/reference/en/html/tutorial.html#tutorial-firstapp
http://www.guj.com.br/java.tutorial.artigo.174.1.guj

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?

Muito obrigado a quem me responder.

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:

<version name="versao" column="versao"/>