Victor,
O padr�o que estou seguindo aqui � o seguinte:
Criei uma classe abstrata ActionBase que extende a classe
Action normal do struts. Nesta classe o "perform" obt�m a
SessionFactory armazenada em uma vari�vel do tipo "ThreadLocal",
criando-a caso necess�rio. Em seguida, chamo um overload do
m�todo "perform" que recebe como argumento adicional a sess�o
obtida na factory. Depois de retornar, executo a seq��ncia
de flush/commit e retorno o forward que tiver voltado da
"perform" especializado.
Este processo est� protegido em um bloco try/catch/finally,
de forma que, em caso de exce��o, seja feito o tratamento
adequado de erro, ou seja, rollback e _descarte da sess�o_ (lembre-se disto
!!!)
Para configura��o, vc. pode usar um m�todo que armazene em uma vari�vel
est�tica da classe base um flag indicando se o Hibernate est� inicializado
ou
n�o. Se n�o estiver, basta chamar o Hibernate.configure(). Algo assim:
public class ActionBase extents Action {
...
private static boolean hiberateConfigurado = false;
private static Object configLock = new Object();
...
public ActionForward perform( ... ) {
// Inicia o hibernate caso necess�rio
if ( !hibernateConfigurado ) {
synchronized( configLock ) {
// Obs: teste para evitar poss�vel corrida
if ( !hibernateConfigurado ) {
Hibernate.configure();
// Pega a factory no JNDI
InitialContext ctx = new InitialContext();
sessionFactory = (SessionFactory)
ctx.lookup("HibernateSessionFactory");
// Salva a factory no servlet context
getServlet().getServletContext().setAttribute("factory",sessionFactory);
// Agora estou configurado
hibernateConfigurado = true;
}
}
}
... obtem a sess�o usando uma vari�vel ThreadLocal
... chama o m�todo "perform" da classe derivada, passando a sess�o de
persist�ncia...
... flush/commit ou rollback/close.
}
Quanto ao filtro, n�o estou achando agora, mas estava l�, sim... De qq modo
sugiro uma boa olhada em http://hibernate.bluemars.net/36.html
----- Original Message -----
From: "Victor Moreira de Gurjao" <[EMAIL PROTECTED]>
To: "'Philippe de M. Sevestre'" <[EMAIL PROTECTED]>
Sent: quarta-feira, 25 de junho de 2003 11:48
Subject: RES: [enterprise-list] Hibernate
> Ol� Philippe,
>
> Primeiramente obrigado por sua resposta. Acho, inclusive, que voc� pode me
> ajudar a chegar exatamente onde desejo... Minha d�vida maior diz respeito
a
> arquitetura.
>
> Estou usando Struts + hibernate. Minhas classes Action acessam uma camada
de
> aplica��o, que acessa uma camada de neg�cio, que acessa uma camada de
> persist�ncia (um pacote com as classes a serem persistidas tal qual vc
> sugeriu).
>
> Meu exemplo consiste em um simples cadastro de usu�rios com uma tela de
> cadastro e edi��o e uma tela de listagem que faculta excluir ou editar os
> itens listados.
> Assim, os passos para o cadastro s�o (de uma forma grosseira):
>
> JSP -> ActionServlet -> ActionForm -> Action -> CamadaAplica��o ->
> CamadaNegocio -> CamadaPersist�ncia
>
> N�o sei onde colocar o Datastore (ou executar o m�todo configure() do
> hibernate), seria uma fun��o chamada logo na "carga" da aplica��o e
deixando
> o SessionFactory no JNDI? Tenho d�vida sobre onde devo colocar a minha
> sess�o (observe que tenho de cadastrar, ver o valor listado, editar,
excluir
> - talvez - e s� ent�o persistir no banco). Suponho eu que devo
compartilhar
> a mesma sess�o para as fun��es de listagem, cadastro, edi��o e exclus�o...
> Ou n�o???
>
> Voc� sugeriu que eu deixasse a ger�ncia do ciclo de vida das sess�es no
> n�vel do "controller". Onde exatamente isso ficaria?
>
> N�o achei o exemplo que voc� citou no site. N�o vi a utiliza��o de
filtros,
> ser� que voc� pode mandar o link? Tenho caracter�stica autodidata e uma
> certa dificuldade em pedir esse tipo de informa��o, pois me sinto meio
man�
> ao faz�-lo... Foi mal estar importunando.
>
> Mais uma vez obrigado e desculpe por usar seu tempo. Tenho um prazo
> relativamente curto para conseguir usar o hibernate de uma forma
decente...
> J� consigo fazer o b�sico. Partir para o avan�ado vai depender um pouco do
> seu help. Valeu!
>
> Atenciosamente,
>
> V�ctor Gurj�o
>
> -----Mensagem original-----
> De: Philippe de M. Sevestre [mailto:[EMAIL PROTECTED]
> Enviada em: ter�a-feira, 24 de junho de 2003 10:04
> Para: [EMAIL PROTECTED]
> Assunto: Re: [enterprise-list] Hibernate
>
>
> Ol� Victor,
>
>
> Para configurar o Hibernate eu uso o m�todo est�tico configure() da classe
> Hibernate. Acho mais simples e meu c�digo de inicializa��o fica desta
forma
> gen�rico, j� que n�o h� depend�ncia das classes a serem persistidas.
>
> Algo assim:
>
> // COnfigura o hibernate a partir do arquivo hibernate.cfg.xml
> // No retorno a session factory estar� registrada no JNDI.
> Hibernate.configure();
>
> // Obt�m factory no JNDI
> Context ctx = new InitialContext();
>
>
> SessionFactory sessionFactory = (SessionFactory)
> ctx.lookup("HibernateSessionFactory");
>
>
> Quanto �s classes a serem registradas no Datastore, vc. ter� registrar
todas
> aquelas a serem persistidas. P.ex. se a classe A possui uma propriedade da
> classe B, ent�o B ter� que estar registrada se o "hbm" de A declarar como
> que a propriedade da classe B � persistente.
>
> ex:
>
> public class A {
>
> // Persistente
> private Long _id;
> public Long getId() { return _id; }
> public void setId( Long id ) { _id = id; }
>
> // Persistente
> private B _b;
> public B getB() { return _b; }
> public void setB( B b ) { _b = b ; }
>
> // N�o persistente
> private C _c;
>
> public C getC() { return _c; }
> public void setC( C c ) { _c = c;}
>
> }
>
>
> A.hbm.xml :
>
>
> <class name="A" table="A">
> <id column="id" name="id" type="java.lang.Long" unsaved-value="null">
> <generator class="native"/>
> </id>
>
> <many-to-one name="b" column="b" class="B" />
> </class>
>
>
> No caso acima, a classe B teria que ser registrada tb. no hibernate, mas
n�o
> a classe C.
>
>
> Quanto � divis�o de camadas, a parte de configura��o do datastore, usando
o
> m�todo acima, fica isolada do resto do sistema. Os classes a serem
> persistidas eu deixo em um mesmo "package" e assim fica f�cil ter uma
vis�o
> completa do modelo l�gico.
>
> Para gerenciar o ciclo de vida das sess�es de persist�ncia, o ideal �
deixar
> isto no n�vel do "controller" da sua aplica��o (estou assumindo aqui que a
> mesma esteja estruturada conforme o pattern MVC). No site do hibernate h�
um
> exemplo de como isto pode ser implementado usando filtros.
>
>
> Espero ter ajudado...
>
> Philippe.
>
>
> ----- Original Message -----
> From: "Victor Moreira de Gurjao" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: segunda-feira, 23 de junho de 2003 16:37
> Subject: [enterprise-list] Hibernate
>
>
> Ol� a todos,
>
> Estou iniciando o uso do Hibernate e tenho uma d�vida sobre a
distribui��o,
> em camadas, dos objetos que controlar�o a persist�ncia dos dados. Pe�o
> desculpas pelo e-mail longo, mas gostaria de deixar claro qual � a
d�vida...
>
> Tenho de criar um Datastore que armazenar� informa��es mapeadas das
classes.
> Devo criar ainda um SessionFactory que "fabricar�" sess�es para acesso aos
> dados. Depois eu uso os m�todos dos objetos-sess�o para inserir, alterar e
> excluir informa��es... Fa�o mais ou menos assim:
>
> Datastore ds = Hibernate.createDatastore();
> ds.storeClass(MinhaClasse1.class);
> sessionFactory = ds.buildSessionFactory();
>
> Session session = sessionFactory.openSession();
>
> session.save(objeto_da_minha_classe_1);
> session.flush();
> session.connection().commit();
> session.close();
>
> D�vidas:
>
> Supondo que quero persistir v�rias classes, devo armazenar as classes
> correlatas no mesmo Datastore? Devo armazenar todas as classes no mesmo
> Datastore (n�o apenas as correlatas)? Devo criar meu Datastore em uma
> camada, meu SessionFactory em outra e os comandos de atualiza��o da em uma
> terceira camada? Algu�m tem algum exemplo, com divis�o dos objetos do
> Hibernate em camadas, que possa ceder para estudo? Algu�m sabe um link que
> indique uma boa divis�o das camadas para esse caso? Em que situa��es devo
> compartilhar do mesmo SessionFactory e do mesmo Datastore?
>
> V�ctor Moreira de Gurj�o
>
> Ps.: Sei que est� meio confuso, mas n�o consegui me expressar melhor.
> Agrade�o respostas a qualquer das perguntas. Obrigado!
>
>
>
> ---------------------------------------------------------------------
> Para cancelar a subscri��o, envie mensagem para:
> [EMAIL PROTECTED]
> Para comandos adicionais, envie mensagem para:
> [EMAIL PROTECTED]
>
---------------------------------------------------------------------
Para cancelar a subscri��o, envie mensagem para: [EMAIL PROTECTED]
Para comandos adicionais, envie mensagem para: [EMAIL PROTECTED]