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.
Une image / un lien ci-dessous est fourni (tel quel) pour télécharger la présentation
Politique de téléchargement : le contenu du site vous est fourni TEL QUEL pour votre information et votre usage personnel ; il ne peut être vendu, concédé sous licence ni partagé sur d’autres sites sans l’accord de son auteur.Le contenu vous est fourni TEL QUEL, pour votre information et votre usage personnel uniquement.Téléchargez la présentation en cliquant sur ce lien.Lors du téléchargement, si vous ne parvenez pas à télécharger une présentation, l’éditeur a peut-être supprimé le fichier de son serveur.Pendant le téléchargement, si vous ne parvenez pas à obtenir une présentation, le fichier a peut-être été supprimé par l’éditeur.
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
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
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
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!
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>
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.
Colocando em funcionamentoAgo/2006Softplan/PoligraphAlessandro Lemser Alessandro Lemser
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
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
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
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
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
Exercícios • Modifique os testes feitos até agora utilizando a pesquisa com relacionamentos. Alessandro Lemser
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
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
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
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
Hibernate/SPW Mapeamentos para a classe Pedido Alessandro Lemser
Hibernate/SPW Código da classe Pedido public class Pedido extends Entity {private Usuario usuario;private List itens;//getters e setters } Alessandro Lemser
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
Hibernate/SPW Mapeamentos para a classe Pedido Alessandro Lemser
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
Hibernate/SPW ...concluindoO hibernate oferece uma maneira fácil, intuitiva e transparente para se fazer o mapeamento objeto relacional com performance. Alessandro Lemser
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
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
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
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
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
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
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
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
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
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
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
Connexion au compte
Connectez-vous pour publier votre contenu sur SlideServe.