1 / 122

Alessandro Lemser

Hibernate 3.2 Ago/2006 Softplan/Poligraph Alessandro Lemser. Alessandro Lemser. Introdução. Hibernate é uma ferramenta de mapeamento objeto-relacional para Java de alta performance.

havyn
Télécharger la présentation

Alessandro Lemser

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Hibernate 3.2Ago/2006Softplan/PoligraphAlessandro Lemser Alessandro Lemser

  2. Introdução • Hibernate é uma ferramenta de mapeamento objeto-relacional para Java de alta performance. • Inclui associação, Herança, polimorfismo, composição e compatibilidade com o framework de coleções do Java. • O Hibertate Query Language (HQL) adiciona extensões orientadas a objeto ao SQL. • Fornece suporte a inúmeras bases relacionais, tais como Oracle, Informix, SQL Server, Interbase, Postgre entre muitas outras. Alessandro Lemser

  3. Introdução • O hibernate espera que seja criado um arquivo XML de mapeamento para a classe que deseja-se persistir. • O arquivo XML faz a ligação entre a classe Java e uma tabela no banco de dados. • Caso a minha classe possui um relacionamento com outra (Cliente possui um Endereço), é no mapeamento que informamos ao hibernate. • Não é necessário codificar SQL para tarefas mais comuns. Alessandro Lemser

  4. Introdução • A classe não precisa ter nada de especial. • Deve seguir as especificações do Javabean • É preciso somente saber qual o campo que será a chave primária na tabela. public class Usuario implements Serializable { private String cdUsuario; private Integer nmUsuario; private String nuCpf; private java.util.Date dtCadastro; //getters e settters } Alessandro Lemser

  5. Introdução <hibernate-mapping> <classname="br.com.softplan.curso.Usuario“table=“ECURUSUARIO"> <id name=“cdUsuario" type=“int” /> <property name="nmUsuario" type="string"/> <property name=“dtCadastro" type="string"/> <property name=“nuCpf“ type="string"/> </class> </hibernate-mapping>

  6. Introdução <hibernate-mapping> <classname="br.com.softplan.curso.Usuario“table=“ECURUSUARIO"> <id name=“cdUsuario" type=“int” /> <property name="nmUsuario" type="string"/> <property name=“dtCadastro" type="string"/> <property name=“nuCpf“ type="string"/> </class> </hibernate-mapping> Aqui eu digo qual é a minha classe e com qual tabela ela se relaciona!

  7. Introdução <hibernate-mapping> <classname="br.com.softplan.curso.Usuario“table=“ECURUSUARIO"> <id name=“cdUsuario" type=“int” /> <property name="nmUsuario" type="string"/> <property name=“dtCadastro" type="string"/> <property name=“nuCpf“ type="string"/> </class> </hibernate-mapping> Identifico minha chave primária.Obs: posso ter chaves compostas e posso, ao invés de informar uma propriedade, informar também uma classe de chave primária.<composite-id name="enderecoPK" class="br.com.softplan.curso.EnderecoPK"> <key-property name="cdEndereco" type="int"/> <key-property name="cdUsuario" type="int"/> </composite-id>

  8. Introdução <hibernate-mapping> <classname="br.com.softplan.curso.Usuario“table=“ECURUSUARIO"> <id name=“cdUsuario" type=“int” /> <property name="nmUsuario" type="string"/> <property name=“dtCadastro" type=“date"/> <property name=“nuCpf“ type="string"/> </class> </hibernate-mapping> Demais propriedades da minha classe que eu quero mapear com tabelas do banco. Se o nome da minha propriedade NÃO coincide com o nome da minha coluna no banco de dados, devo informar o atributo column, contendo o nome da coluna correspondente no banco de dados.

  9. Colocando em funcionamentoAgo/2006Softplan/PoligraphAlessandro Lemser Alessandro Lemser

  10. Funcionamento • É necessário ter um arquivo XML, chamado hibernate.cgf.xml, contendo informações úteis para o Hibernate. (posso também informar, ao invés de um XML, o arquivo hibernate.properties). • Neste arquivo basicamente temos: - Como o hibernate vai conseguir as conexões com o banco - Qual o dialeto (Oracle, SQLServer, DB2, etc...) - Quais são e onde estão os arquivos XML de mapeamento Alessandro Lemser

  11. Funcionamento <hibernate-configuration> <session-factory> <property name="connection.driver_class"> oracle.jdbc.driver.OracleDriver </property> <property name="connection.url"> jdbc:oracle:thin:@server23:1531:DERBADES </property> <property name="connection.username">sider</property> <property name="connection.password">projeto1</property> <property name="show_sql">true</property> <property name="use_outer_join">true</property> <property name="hibernate.dialect"> org.hibernate.dialect.OracleDialect </property> <!-- mapeamentos --> <mapping resource="Usuario.hbm.xml"/> <mapping resource="Endereco.hbm.xml"/> </session-factory> </hibernate-configuration> Alessandro Lemser

  12. Funcionamento <hibernate-configuration> <session-factory> <property name="connection.driver_class"> oracle.jdbc.driver.OracleDriver </property> <property name="connection.url"> jdbc:oracle:thin:@server23:1531:DERBADES </property> <property name="connection.username">sider</property> <property name="connection.password">projeto1</property> <property name="show_sql">true</property> <property name="use_outer_join">true</property> <property name="hibernate.dialect"> org.hibernate.dialect.OracleDialect </property> <!-- mapeamentos --> <mapping resource="Usuario.hbm.xml"/> <mapping resource="Endereco.hbm.xml"/> </session-factory> </hibernate-configuration> Informações sobre a conexão:Posso informar conexões standalone ou um datasource<property name=“connection.datasource”> java:CURSODS</property> Alessandro Lemser

  13. Funcionamento <hibernate-configuration> <session-factory> <property name="connection.driver_class"> oracle.jdbc.driver.OracleDriver </property> <property name="connection.url"> jdbc:oracle:thin:@server23:1531:DERBADES </property> <property name="connection.username">sider</property> <property name="connection.password">projeto1</property> <property name="show_sql">true</property> <property name="use_outer_join">true</property> <property name="hibernate.dialect"> org.hibernate.dialect.OracleDialect </property> <!-- mapeamentos --> <mapping resource="Usuario.hbm.xml"/> <mapping resource="Endereco.hbm.xml"/> </session-factory> </hibernate-configuration> Informações de runtime:Se usa outer join por padrão e se mostra os SQLs enviados ao banco no console. Alessandro Lemser

  14. Funcionamento <hibernate-configuration> <session-factory> <property name="connection.driver_class"> oracle.jdbc.driver.OracleDriver </property> <property name="connection.url"> jdbc:oracle:thin:@server23:1531:DERBADES </property> <property name="connection.username">sider</property> <property name="connection.password">projeto1</property> <property name="show_sql">true</property> <property name="use_outer_join">true</property> <property name="hibernate.dialect"> org.hibernate.dialect.OracleDialect </property> <!-- mapeamentos --> <mapping resource="Usuario.hbm.xml"/> <mapping resource="Endereco.hbm.xml"/> </session-factory> </hibernate-configuration> DIALETO:Permite gerar SQL customizados para cada banco de dados. Alessandro Lemser

  15. Funcionamento • Para começar a usar o hibernate agora só utilizamos duas linhas. Só lembrando que as bibliotecas do hibernate esteja configuradas no ambiente. Configurarion cfg = new Configuration().configure(); SessionFactory factory = cfg.buildSessionFactory(); ...public void initHibernate() { Configuration cfg = new Configuration().configure(); this.sessionFactory = cfg.buildSessionFactory(); } Alessandro Lemser

  16. Queries • O procedimento para realizar uma query com Hibernate é o seguinte: • Ter um SessionFactory válido • Obter o objeto Session do SessionFactory • *Iniciar uma transação (obter o objeto Transaction) • Executar a query • *Comitar • Fechar a sessão.* exceto selects e transações gerenciadas pelo Container Alessandro Lemser

  17. Queries public Usuario getUsuario( Integer cdUsuario ) throws ObjectNotFoundException { Session session = this.sessionFactory.openSession();try { Transaction t = session.beginTransaction(); Object usr = session.get(Usuario.class, cdUsuario); t.commit();return (Usuario) usr; } finally { session.close(); }return null; } 1,2 3 4 5 6 Alessandro Lemser

  18. Queries public List getUsuariosByNome(String nome) throws ObjectNotFoundException { Session session = this.sessionFactory.openSession(); Transaction t = session.beginTransaction(); String hql = "From Usuario as usuario " + "Where usuario.nmUsuario LIKE '%" + nome + "%'"; Query query = this.currentSession.createQuery( hql ); List usrs = query.list(); t.commit(); session.close(); return usrs; } Alessandro Lemser

  19. Insert, delete e update publicvoid saveOrUpdate(Object obj) { Transaction t = this.currentSession.beginTransaction(); try { this.currentSession.saveOrUpdate( obj ); } catch (Exception ex) { t.rollback(); } t.commit(); } Alessandro Lemser

  20. Insert, delete e update publicvoid delete(Object obj) { Transaction t = this.currentSession.beginTransaction(); try { this.currentSession.delete( obj ); } catch (Exception ex) { t.rollback(); } t.commit(); } Alessandro Lemser

  21. Relacionamentos • Com hibernate é relativamente simples realizar mapeamentos do tipo: one-to-many, one-to-one, many-to-one, many-to-many... • Imagine que a classe Usuario possua um relacionamento com Endereco. public class Usuario implements Serializable { private String cdUsuario; private Integer nmUsuario; private String nuCpf; private java.util.Date dtCadastro; private Endereco endereco; //getters e settters } Alessandro Lemser

  22. Relacionamentos • Agora eu quero que quando eu selecione um cliente, seu endereço venha junto. Para isso, tenho que fazer um relacionamento no arquivo de mapeamento do hibernate. <hibernate-mapping> <classname="br.com.softplan.curso.Usuario“table=“ECURUSUARIO"> <id name=“cdUsuario" type=“int” /> <property name="nmUsuario" type="string"/> <property name=“dtCadastro" type="string"/> <property name=“nuCpf“ type="string"/> <property name=“cdEndereco” type=“int”/> <many-to-onename=”endereco”insert=“false”update=“false”cascade=“none”outer-join=“true”/> </class> </hibernate-mapping> Alessandro Lemser

  23. Exercícios • Modifique os testes feitos até agora utilizando a pesquisa com relacionamentos. Alessandro Lemser

  24. Hibernate no SPWAgo/2006Softplan/PoligraphAlessandro Lemser Alessandro Lemser

  25. Hibernate/SPW • O Hibernate está associado ao SPW na forma do pattern DAO (Data Access Objects) • Elementos: - Interface e classe de implementação Ex. Interface: br.com.softplan.curso.dao.UsuarioDAO Ex. impl: br.com.softplan.curso.dao.hbn.HbnUsuarioDAO • - Fábrica de DAOs Ex: br.com.softplan.curso.dao.CursoDAOFactory • - dao.properties: lugar onde a fábrica de DAO vai buscar a classe que realiza a implementação do DAO solicitado. Ex: UsuarioDAO=br.com.softplan.curso.dao.hbn.HbnUsuarioDAO Alessandro Lemser

  26. Hibernate/SPW • Mapeamentos em XML: O hibernate realiza o mapeamento do objeto Entity com a tabela no banco por meio de um arquivo XML, conforme visto. Ex: Pedido.hbm.xml • hibernate.mappings: Listagem de todos os mapeamentos existentesbr/com/softplan/sider/alx/dao/hbn/mapping/Orgaosetor.hbm.xml br/com/softplan/sider/alx/dao/hbn/mapping/Tipoexpediente.hbm.xml br/com/softplan/sider/alx/dao/hbn/mapping/Almoxarifado.hbm.xml br/com/softplan/sider/alx/dao/hbn/mapping/Usuario.hbm.xml br/com/softplan/sider/alx/dao/hbn/mapping/Material.hbm.xml br/com/softplan/sider/alx/dao/hbn/mapping/Pedido.hbm.xml br/com/softplan/sider/alx/dao/hbn/mapping/Pedidoitem.hbm.xml • hibernate.properties: Informações úteis para o hibernate rodar hibernate.session_factory_name=br.com.softplan.sider.alx.dao/SessionFactory hibernate.connection.datasource=java:/ALXDS hibernate.dialect=net.sf.hibernate.dialect.OracleDialect hibernate.show_sql=true hibernate.use_outer_join=true Alessandro Lemser

  27. Hibernate/SPW • List findAll()- Retorna todos os elementos da entidade. • List findAll(Object obj)- Retorna todos os elementos da entidade, e utiliza o objeto passado como parâmetro como filtro. O objeto pode ser um Entity ou um EntityPK Usuario usuario = new Usuario():usuario.setNmUsuario(“Maria”);List usuarios = usuarioEJB.findAll( usuario ); • Entity findByPrimaryKey( EntityPK entityPK )- Retorna o elemento correspondente a chave primária passada como parâmetro Alessandro Lemser

  28. Hibernate/SPW • void save(Entity entity)- Salva, atualiza ou apaga uma entidade do modelo - Rotina de gerar código é integrada, não é preciso se preocupar em gerar um código para a entidade. O SPW espera que o último campo da chave primária é o que deve ser gerado. • void saveAll(List entities) - Salva, atualiza ou apaga uma lista de entidades do banco de dados. Alessandro Lemser

  29. Hibernate/SPW Mapeamentos para a classe Pedido Alessandro Lemser

  30. Hibernate/SPW Código da classe Pedido public class Pedido extends Entity {private Usuario usuario;private List itens;//getters e setters } Alessandro Lemser

  31. Hibernate/SPW Após declarar os atributos no XML, declaram-se os relacionamentos <many-to-onename=“usuario" column="cdUsuario" cascade="none" insert="false" update="false" outer-join="true"/> Relacionamentos many-to-one Alessandro Lemser

  32. Hibernate/SPW Mapeamentos para a classe Pedido Alessandro Lemser

  33. Hibernate/SPW Mapeando coleções Nome da propriedade do tipo List em Pedido <bagname="itens"> <key> <columnname="cdPedido"/> <columnname="nuSeqpedido"/> </key> <one-to-manyclass="br.com.softplan.sider.alx.Pedidoitem"/> </bag> Alessandro Lemser

  34. Hibernate/SPW Mapeando alternate-keys <many-to-onename="material" class="br.com.softplan.sider.alx.Material" column="cdMaterial" unique="true" insert="false" update="false"/> Alessandro Lemser

  35. Hibernate/SPW ...concluindoO hibernate oferece uma maneira fácil, intuitiva e transparente para se fazer o mapeamento objeto relacional com performance. Alessandro Lemser

  36. SPW 3.4Ago/2006Softplan/PoligraphAlessandro Lemser Alessandro Lemser

  37. Tópicos IntroduçãoComponentes - Persistência - Lógica - ApresentaçãoWizardGrids - Search - Associative - Grid - List - PaginadaInputSelect Alessandro Lemser

  38. Introdução • Framework para desenvolvimento de aplicações multicamadas usando tecnologia J2EE. • Baseado em outros frameworksOpen Source que, no mercado atual, são considerados padrão de facto (Struts, Hibernate). • A camada de lógica de negócios é baseada basicamente em Stateless SessionBeans. • Aproveita a infra-estrutura fornecida pelo servidor de aplicação e container EJB (transações, pool de conexões, segurança, etc...). Alessandro Lemser

  39. Introdução • Automatiza tarefas comuns e repetitivas da WEB, especializando o Struts e os SessionBeans para a realidade de desenvolvimento da empresa. • Gera automaticamente os arquivos necessários para a aplicação com base no modelo de dados (wizard). • É integrado com o Hibernate. • Define um padrão para o desenvolvimento e ajuda a promover fraco acoplamento entre camadas. • Possui componentes para as 3 camadas vistas anteriormente... Alessandro Lemser

  40. Componentes para as camadasSPW 3.4 Alessandro Lemser

  41. Componentes • Persistência • Utiliza o Hibernate em uma estrutura de DAO. • Para cada tabela no banco, são gerado os seguintes Objetos. Abaixo segue um exemplo do que seria gerado para a tabela esegUsuario.br.com.softplan.curso.UsuarioRepresenta a entidade br.com.softplan.curso.UsuarioPKRepresenta a chave primária da entidade br.com.softplan.curso.UsuarioValidatorClasse de validação que sempre é chamada antes de operações sobre o banco de dados. Alessandro Lemser

  42. Componentes Persistência publicclass UsuarioPK extends EntityPK { private String cdUsuario; public String getCdUsuario() { returnthis.cdUsuario; } publicvoidsetCdUsuario(String newCdUsuario) { this.cdUsuario = newCdUsuario; } } esegUsuario cdUsuario (PK)nmUsuariodtCadastrodeEmail.... A partir da tabela do banco de dados, são geradas as classes... publicclass Usuario extends Entity { private UsuarioPK usuarioPK; private String nmUsuario; ..... } Alessandro Lemser

  43. Componentes Persistência publicclass UsuarioPK extends EntityPK { private String cdUsuario; public String getCdUsuario() { returnthis.cdUsuario; } publicvoidsetCdUsuario(String newCdUsuario) { this.cdUsuario = newCdUsuario; } } esegUsuario cdUsuario (PK)nmUsuariodtCadastrodeEmail.... publicclass Usuario extends Entity { private UsuarioPK usuarioPK; private String nmUsuario; ..... } Alessandro Lemser

  44. Componentes Persistência publicclass UsuarioPK extendsEntityPK { private String cdUsuario; public String getCdUsuario() { returnthis.cdUsuario; } publicvoid setCdUsuario(String newCdUsuario) { this.cdUsuario = newCdUsuario; } } Superclasse do SPW.Contém algumas implementações comuns para as subclasses. Superclasse do SPW.Contém algumas implementações comuns para as subclasses. Uma importante é a informação sobre o estado (isStatusInsert, isStatusDelete, getStatus(), setStatus, etc...) publicclass Usuario extendsEntity { private UsuarioPK usuarioPK; private String nmUsuario; ..... } Alessandro Lemser

  45. Componentes • Persistência • O Validator possui pouco uso, devido à requisitos de campos obrigatórios que são diferentes em cada sistema, porém, pode ser útil em algumas situações. publicclass UsuarioValidator implements Validator { publicboolean supports(Class clazz) { return clazz.equals(Usuario.class); } publicvoid validate(Object obj, Errors errors) { Usuario usuario = (Usuario) obj;if( usuario.getDeEmail() == null ) { errors.add(new Error(“Email invalido”)); } } } Alessandro Lemser

  46. Componentes • Persistência • Como o SPW usa o Hibernate, são gerados os mapeamentos das classes para a tabela e a estrutura de DAO, com os métodos mais comuns já implementados. • Além das classes são gerados os seguintes artefatos: - DAOFactory: responsável por criar objetos que implementam a Interface DAO. • dao.properties: Permite maior flexibilidade na troca da classe que implementa o DAO, ligando um nome à uma classe de implementação da Interface DAO. • hibernate.mappings: Contém a localização de todos os arquivos de mapeamento do hibernate. • hibernate.properties: Configurações do hibernate. Alessandro Lemser

  47. Componentes Persistência O arquivo de XML de mapamento:<hibernate-mapping> <class name="br.com.softplan.curso.Usuario“ table="ESEGUSUARIO"> <composite-id name=“usuarioPK“ class="br.com.softplan.curso.UsuarioPK"> <key-property name="cdUsuario" type="int"/> </composite-id> <property name="nmUsuario" type="string"/> <!– demais propriedades --> </hibernate-mapping> Alessandro Lemser

  48. Componentes Persistência • A interface e a classe de implementação do DAO. publicinterface UsuarioDAO extends EntityDAO { //se precisar de métodos customizados, declarar aqui } publicclass HbnUsuarioDAO extends AlxHbnEntityDAO implements UsuarioDAO { //se precisar de métodos customizados, implementar aqui } Alessandro Lemser

  49. Componentes Persistência • A interface e a classe de implementação do DAO. publicinterface UsuarioDAO extends EntityDAO { } Interface do framework que contém a declaração dos métodos implementados por ele. publicclass HbnUsuarioDAO extends AlxHbnEntityDAO implements UsuarioDAO { } Classe do framework que contém a implementação dos métodos implementados por ele. Alessandro Lemser

  50. Componentes Persistência • DAOFactory. public class DAOFactory implements DAOServiceProvider { public static final String DAO_FILE_NAME = NameConventionUtil.getDAOFileName(DAOFactory.class,"dao.properties"); public Object getDAO(String daoname) { return ObjectFactory.getObject(daoname, DAO_FILE_NAME); } public UsuarioDAO getUsuarioDAO() { return (UsuarioDAO) getDAO(“UsuaioDAO"); }} Alessandro Lemser

More Related