1.23k likes | 1.42k Views
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.
E N D
Hibernate 3.2Ago/2006Softplan/PoligraphAlessandro Lemser Alessandro Lemser
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>
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 <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
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
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
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
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
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
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
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
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
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 no SPWAgo/2006Softplan/PoligraphAlessandro Lemser 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 Mapeando alternate-keys <many-to-onename="material" class="br.com.softplan.sider.alx.Material" column="cdMaterial" unique="true" insert="false" update="false"/> 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
SPW 3.4Ago/2006Softplan/PoligraphAlessandro Lemser Alessandro Lemser
Tópicos IntroduçãoComponentes - Persistência - Lógica - ApresentaçãoWizardGrids - Search - Associative - Grid - List - PaginadaInputSelect 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 para as camadasSPW 3.4 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 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
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