Hibernate + JBoss Mapeamento O-R em aplicações corporativas Ricardo Cavalcanti [email protected] Jobson Ronan [email protected] Hibernate + JBoss Vantagens Gerenciamento dos detalhes de configurações do Hibernate Gerenciamento de suas Sessões do Hibernate Hibernate + JBoss Usando o Hibernate no JBoss podemos fazer o deploy de nossa aplicação como um “Hibernate Archive”, .har Torna o uso do Hibernate ainda mais simples Hibernate MBean O Hibernate Archive instancia e configura o Hibernate MBean Este será responsável por construir o SessionFactory e registra-lo no JNDI O Hibernate MBean, também permite inspecionar e alterar as configurações do SessionFactory em tempo de execução Hibernate MBean Exemplo <mbean code="org.jboss.hibernate.jmx.Hibernate“ name="jboss.har:service=Hibernate"> <attribute name="DatasourceName">java:/DefaultDS</attribute> <attribute name="Dialect"> net.sf.hibernate.dialect.HSQLDialect </attribute> <attribute name="SessionFactoryName"> java:/hibernate/SessionFactory </attribute> <attribute name="CacheProviderClass"> net.sf.hibernate.cache.HashtableCacheProvider </attribute> </mbean> ...muito semelhante a configuração do hibernate Hibernate archive Contém classes e mapeamentos mais um deployment descriptor hibernateservice.xml no diretório META-INF hibernate-service.xml <server> <mbean code="org.jboss.hibernate.jmx.Hibernate“ name="jboss.har:service=Hibernate"> <attribute name="DatasourceName">java:/DefaultDS</attribute> <!-- .... --> </mbean> </server> Hibernate archive Estrutura típica Usando objetos Hibernate Quando é feito o deploy do hibernate archive, os objetos do Hibernate ficam disponíveis a outras aplicações através do SessionFactory Uma vez este estando registrado no JNDI, pode se fazer um simples lookup e manualmente criar uma Hibernate Session InitialContext ctx = new InitialContext(); SessionFactory factory = (SessionFactory) ctx.lookup("java:/hibernate/SessionFactory"); Session hsession = factory.openSession(); Usando objetos Hibernate Esta forma de acesso requer gerenciamento manual das sessões e transações do hibernate Pode ser útil para migrar código já existente para o JBoss Porém, no contexto de grandes aplicações J2EE, seria interessante que os objetos do hibernate fizessem parte de uma transaçao JTA existente Usando objetos Hibernate Situação comum no caso de querer acessar objetos do hibernate em um Session Bean O JBoss possui a classe HibernateContext (pkg: org.jboss.hibernate.session) para facilitar esta integração Método getSession retorna a Session do hibernate ligada a transação JTA corrente Session hsession = HibernateContext.getSession( "java:/hibernate/CaveatEmptorSessionFactory"); Usando objetos Hibernate Desta forma não é necessário fechar as sessões, tampouco gerenciar as transações Garante um gerenciamento de transações de forma declarativa Usando objetos Hibernate Cuidado com suas lazy collections Uma vez se seus objetos são serializado e enviados até um cliente, lazy collections passam a não funcionar. HAR dentro do EAR Arquivos HAR podem ser usados como componentes de um arquivo EAR durante o deploy Porém, como arquivo HAR não é um tipo padrão J2EE este precisa ser declarado no arquivo jboss-app.xml <!DOCTYPE jboss-app PUBLIC "-//JBoss//DTD J2EE Application 1.4//EN" "http://www.jboss.org/j2ee/dtd/jboss-app_4_0.dtd"> <jboss-app> <module> <har>caveatemptor.har</har> </module> </jboss-app> Mini-projeto Implementar o seguinte modelo no hibernate Mini-projeto Implementar um Stateless Session Bean no padrão SessionFacade com as seguintes funcionalidades Referências The JBoss 4 Application Server Guide, release 2