Hibernate – Introdução rápida Jobson Ronan {[email protected]}

Click here to load reader

  • date post

    07-Apr-2016
  • Category

    Documents

  • view

    217
  • download

    1

Embed Size (px)

Transcript of Hibernate – Introdução rápida Jobson Ronan {[email protected]}

  • Hibernate Introduo rpidaJobson Ronan {[email protected]}

  • ObjetivoMostrar uma aplicao simples que demonstra o uso de HibernateO objetivo no explorar os recursos do Hibernate, mas apenas colocar o ambiente de sala de aula para funcionarA aplicao utilizada ser uma espcie de Hello World persistente

  • Configurao do ambientePara demonstrar o uso de Hibernate, precisamos ter no ambiente de sala de aula:Um sistema de gerenciamento de banco de dados (remoto ou local) com driver JDBC e acesso para criao de tabelas em pelo menos uma base de dadosAmbiente de execuo / desenvolvimento Java

  • SGBDPode ser qualquer banco de dados com driver JDBC.Nos exemplos, usaremos MySQL (www.mysql.com)Use a tela de administrao do mysqlcc paraLogar no sistemaCriar uma base de dados hellohibernateExecutar queries diretamente no bancoVerificar o esquema das tabelas

  • Criao da base de dadosUse a interface do seu SGBD1) Crie a seguinte base de dadoshellohibernate

    2) Crie a seguinte tabelacreate table message ( message_id integer identity, message_text varchar(255), next_message integer)

  • Hello WorldEsta aplicao simples consiste de uma classeum arquivo de mapeamentouma tabela de banco de dadosO objetivo armazenar mensagens em um banco de dados e recuper-las.Usaremos um ambiente standalone

  • A classepackage hello;

    public class Message { private Long id; private String text; private Message nextMessage;

    public Message() {} public String getText() { return text; }

    public void setText(String text) { this.text = text; }

    // getters e setters e outros construtores}

  • A classePossui:Identificador da mensagem (id),Texto da mensagem (text)Referncia para prxima mensagem (nextMessage) um POJO/Java BeanNo tem nada a ver com o HibernatePode ser usado em qualquer aplicao Java.Segue as convenes usadas em JavaBeans

  • Os Meta dados de mapeamentoAs informaes sobre o mapeamento entre a tabela e a classe Message ficam em um arquivo XMLGuarde-o no mesmo pacote que a classeChame-o de Message.hbm.xml

  • Hibernate produtividade!No tenha medo dos metadados XML!Siga as convenes que eles se mantm simplesPode-se gerar tudo em HibernateO arquivo XML de mapeamento pode ser gerado automaticamente de classes ou tabelasClasses podem ser geradas automaticamente a partir de tabelasTabelas podem ser geradas automaticamente a partir de classesOutros arquivos de configurao podem ser geradosMais adiante apresentaremos ferramentas que realizam essas tarefas

  • Arquitetura do HibernateAntes de comear, vamos conhecer um pouco da APIA API do Hibernate est organizada nos pacotes e subpacotes de org.hibernatePodemos classificar suas interfaces em quatro gruposInterfaces chamadas pelas aplicaes para realizar operaes CRUD* e queries: Session, Transaction e QueryInterfaces de configurao: ConfigurationInterfaces de callback: Interceptor, Lifecycle, ValidatableInterfaces de extenso de mapeamento: UserType, CompositeUserType, IdentifierGenerator

  • Arquitetura do Hibernate

  • Principais interfacesCinco interfaces fundamentais so usadas em quase qualquer aplicaoServem para armazenar, remover, atualizar e recuperar objetos persistentes e lidar com transaesEsto listados abaixo na ordem em que (geralmente) so usadasConfiguration: carrega dados de configuraoSessionFactory: obtida de uma Configuration; permite criar sesses de interao com a camada de persistnciaSession: principal objeto usado para ler, gravar, atualizar, etc.Transaction: camada sobre sistemas de transaes nativoQuery ou Criteria: realizam pesquisa no modelo de objetos

  • SessionPrincipal interface usada em aplicaes HibernateTodas as operaes explcitas de persistncia so realizadas atravs de um objeto SessionObjeto leve Fcil de criar Fcil de destruirObjetos Session no so threadsafeDevem ser usados em um nico threadPara threads adicionais, crie sessions adicionais

  • SessionFactoryUma aplicao obtm uma Session a partir de uma SessionFactoryObjeto pesado; lento para inicializar e destruirGeralmente tem-se uma apenas para toda a aplicaoDeve-se ter uma SessionFactory para cada banco de dados utilizadoRealiza cache de comandos SQL, dados e metadados usados em tempo de execuo

  • Configuration o ponto de partida para iniciar o HibernateInicializado com propriedades de configurao do sistemaEspecifica a localizao de dados e arquivos de mapeamento, objetos, configurao do banco de dados, pool de conexes, dialeto do SQL do banco, etc.Geralmente obtm a configurao via arquivos .properties, XML ou propriedades dinmicasCria a SessionFactory

  • TransactionAbstrao da implementao de transaes usada no cdigoA implementao real pode ser uma transao JTA, JDBC, etc.Essencial para garantir a portabilidade de aplicao entre diferentes ambientes e containersEncapsula o objeto de transao nativo em servidores de aplicao ou outros ambientes controlados

  • Query e CriteriaPermite a realizao de consultas ao bancoConsultas Query so escritas em HQL (Hibernate Query Language) ou no SQL nativo do banco.Objetos Query so usados para Passar parmetros para a consulta em HQLFiltrar resultadosExecutar os comandos da consultaCriteria uma alternativa que faz a mesma coisa usando mtodos da API (em Java, em vez de HQL)Uma Query s pode ser usada dentro de sua sesso

  • Usando a API do Hibernate em 3 passos1) Primeiro preciso obter um objeto de sesso Session. Session session = ...;Atravs desse objeto possvel realizar operaes de leitura e gravao 2) Para gravar, crie um objeto da maneira usual e grave na sesso usando save()Message message = new Message();message.setText(Hello World!);session.save(message);3) Para ler todas as mensagens, envie um query via createQuery().list()List messages = session.createQuery(from Message).list();

  • Manipulao do objeto persistenteLeitura de uma mensagem especfica

    Alterao da mensagem acima (sem usar Session)

    Message message = (Message) session.load(Message.class, 1);message.setText("Greetings Earthling");Message nextMessage = new Message("Take me to your leader (please)");message.setNextMessage( nextMessage );A Session deve estar aberta para a persistncia ocorrer!

  • Manipulao do objeto persistenteLeitura de vrias mensagens do banco

    Session newSession = getSessionFactory().openSession();Transaction newTransaction = newSession.beginTransaction();

    List messages = session .createQuery("from Message as m order by m.text asc").list;System.out.println( messages.size() + " message(s) found:" );for ( Iterator iter = messages.iterator(); iter.hasNext(); ) { Message message = (Message) iter.next(); System.out.println( message.getText() );}newTransaction.commit();newSession.close();

  • QueriesOs comandos do slide anterior geram queries no Hibernate que conceitualmente* equivalem aos queries abaixoAtualizao

    Leitura* O Hibernate poder gerar queries diferentes que fazem a mesma coisaselect m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID from MESSAGES m where m.MESSAGE_ID = 1

    insert into MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID) values (2, 'Take me to your leader (please)', null)

    update MESSAGES set MESSAGE_TEXT = 'Greetings Earthling', NEXT_MESSAGE_ID = 2 where MESSAGE_ID = 1select m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID from MESSAGES m order by m.MESSAGE_TEXT asc

  • Como configurarPara colocar para funcionar a aplicao exemplo, preciso configurar o Hibernate no ambiente de execuoHibernate pode ser configurado para rodar em praticamente qualquer aplicao JavaNo precisa estar em servidor J2EEO nico servidor necessrio um SGBDAmbientes gerenciados: transaes demarcadas declarativamente; conexes gerenciadas pelo servidorServidores de aplicao, por exemplo, o JBossAmbientes no-gerenciados: a aplicao gerencia conexes de banco de dados e demarca transaesAplicaes standalone fora de servidorServidores Web, por exemplo, o Tomcat

  • Criao de um SessionFactoryCrie uma nica instncia de Configuration

    Passe as propriedades para configurar o ambiente

    Obtenha a SessionFactorycfg.addResource("hello/Message.hbm.xml");Properties p = System.getProperties();p.load(ClassLoader.getSystemResourceAsStream("hibernate.properties")); cfg.setProperties( p );SessionFactory factory = cfg.buildSessionFactory();Session session = factory.openSession();Configuration cfg = new Configuration();

  • ConvenoArquivos de mapeamento geralmente tm (por conveno) a extenso .hbm.xmlDeve-se ter um arquivo por classe (tambm por conveno) e mant-lo no mesmo diretrio (pacote) que as classes compiladasSe for seguida essa conveno, pode-se carregar as classes da forma:

    E de outras formas, usando configurao em XMLEnto, siga a conveno!cfg.addClass(hello.Message.class)cfg.addClass(hello.Author.class)

  • Configurao em ambientes no gerenciadosEm ambientes no gerenciados, a aplicao responsvel por obter conexes JDBCDeve-se sempre usar um pool de conexes para obter uma conexoO Hibernate faz interface com o pool isolando-o da aplicao

    Fonte: Bauer/King. Hibernate In Action, Manning, 2005

  • hibernate.propertiesH vrias formas de configurar o Hibernate; uma delas usar um arquivo hibernate.propertiesO arquivo de configurao abaixo tem trs partesA primeira inicializa o driver JDBC (banco Postgres)A segunda descreve o dialeto do SQL usadoA terceira inicializa o Hibernate para usar o servio C3PO como pool de conexes (O C3PO distribudo com o Hibernate)

    hibernate.connection.driver_class=com.mysql.jdbc.Driverhibernate.connection.url=jdbc:mysql://localhost/helohibernatehibernate.connection.username=roothibernate.connection.password=

    hibernate.dialect=org.hibernate.dialect.MySQLDialect

    hibernate.c3p0.min_size=5hibernate.c3p0.max_size=20hibernate.c3p0.timeout=300hibernate.c3p0.max_statements=50hibernate.c3p0.idle_test_period=3000

  • Arquivos .propertiesArquivos .properties so equivalentes classe java.util.PropertiesPropriedades carregadas tornam-se propriedades de objeto java.util.PropertiesDevem declarar uma propriedade (nome=valor) por linhaNomes so declarados na primeira coluna at o = ou :, aps o qual declarado o valorEspaos so significativos depois do =Uma quebra de linha termina a propriedade\ (contra barra) smbolo de escape (escapa inclusive quebra de linha)Para carregarPonha no Classpath para carga automtica pela aplicao (quando suportado)Carregamento explcito (do Classpath)Properties p = new Properties();p.load(Classloader.getSystemResourceAsStream(arquivo));Veja mais nos Java Docs de java.util.Properties

  • Referncia: propriedades JDBChibernate.connection.driver_class=nome.de.Classe classe do driver (deve estar no classpath)hibernate.connection.url=url:jdbcjdbc URLhibernate.connection.username=nome usurio do banco de dadoshibernate.connection.password=senha senha do banco de dadoshibernate.connection.pool_size=numero nmero mximo de conexeshibernate.c3po.*diversas propriedades para configurar o pool C3POhibernate.proxool.*diversas propriedades para configurar o pool Proxoolhibernate.dbcp.ps.*diversas propriedades para configurar o pool DBCP (com PreparedStatement)

  • Referncia: propriedades de configuraohibernate.dialect=nome.de.ClasseImplementao de um dialeto (veja slide seguinte)hibernate.show_sql=true|falsetil para debugging. Escreve todo o SQL gerado para o console.hibernate.max_fetch_depth=numeroDefine uma profundidade mxima para a rvore de recuperao de outer-join. 0 desabilita outer-join como default. Evite valores maiores que 3.hibernate.connection.propriedade=valorPassa propriedades para DriverManager.getConnection() (configurao de JDBC)

  • Referncia: dialetos SQL suportadoshibernate.dialect=org.hibernate.dialect. onde pode ser qualquer um dos presentes no pacote org.hibernate.dialect

  • Para rodar a aplicaoColoque no Classpathhibernate.properties hibernate-xxx.jar e outros JARs requeridos (pegue todos os JARs da distribuio do Hibernate)Driver do banco de dados usadoInicie o banco de dados (se j no estiver iniciado)Execute a aplicao

  • hibernate.cfg.xml uma outra forma (melhor) de prover informaes de configurao aplicaoTambm deve ser guardada no ClasspathTem precedncia sobre hibernate.propertiesPropriedades definidas nos dois sero sobrepostasDefinePropriedades da Session Factory usando (os nomes so iguais, sem o prefixo hibernate.*)Arquivos de mapeamento de instncias

  • hibernate.cfg.xml e mapeamentoPara mapear automaticamente:No arquivo use o tag para descrever a localizao dos mapeamentosNa inicializao via Configuration, use conf.configure() (onde conf objeto Configuration) em vez de addClass() ou addResource()Exemplo de usoSessionFactory sf = new Configuration() .configure().buildSessionFactory();

  • Exemplo de hibernate.cfg.xml

    com.mysql.jdbc.Driver jdbc:mysql://localhost/helohibernate root org.hibernate.dialect.MySQLDialect false

  • Cdigo de um main() completoConfiguration cfg = new Configuration();cfg.addClass(Message.class);Properties p = System.getProperties();p.load( ClassLoader.getSystemResourceAsStream("hibernate.properties")); cfg.setProperties( p );SessionFactory factory = cfg.buildSessionFactory();Session session = factory.openSession();Transaction tx = session.beginTransaction();Message message = new Message();message.setText("Hello World");session.save(message);

    tx.commit();session.close();

  • Bsico sobre mapeamentoO DTD declarado em cada arquivoO elemento raiz O mapeamento classe-tabela feito no elemento Pode-se ter vrias em um Recomenda-se (conveno) ter somente um ; assim, o nome do arquivo deve ser NomeDaClasse.hbm.xmlUm elemento em cada mapeia o identificador do objeto a uma chave primria da tabelaOs elementos servem para mapear as colunas restantes s propriedades do objeto

  • Um mapeamento tpico defineNome de propriedade JavaBean. Ex: nameNome de coluna. Ex: NAMENome de tipo Hibernate. Ex: stringA declarao explcita de tipos pode ser opcionalO comportamento default converter o tipo Java no tipo Hibernate mais prximoDeclarao explcita do nome da coluna do banco de dados pode ser opcionalSe no for declarado explicitamente, o Hibernate assume que o nome da coluna igual ao nome da propriedade JavaBean

  • Declaraes equivalentes:

  • Semelhante a Porm representa a chave primria do objetovalor retornado por session.getIdentifier(objeto)Acesso (conveno)Declare getId() com acesso pblicoDeclare setId() com acesso privativo (a identidade de um objeto nunca deve mudar)Por causa do mapeamento, a identidade BD entre objetos a e b pode ser testada usandoa.getId().equals(b.getId())

  • Chaves podem ser geradas pelo Hibernatenative: automaticamente escolhe a estratgia mais adequada (dentre as outras opes abaixo) de acordo com os recursos disponveis no banco de dados usadoidentity: gera inteiro (at tamanho long) e suporta colunas identity em DB2, MySQL, MS SQL Server, HSQLDB, Sybase, Informixsequence: gera inteiro (at long) e compatvel com o sequence de Oracle, DB2, SAP DB, McKoi, Fifrebird ou generator em InterBaseincrement: controle nativo do Hibernate; eficiente se a aplicao Hibernate tem acesso exclusivo aos dados (gera inteiro at long)hilo: usa um algortmo eficiente (high-low) para gerar identificadores inteiros (at long) unvocos apenas para um banco especfico.H outras menos usadas; tambm possvel criar novas

  • Resumo: tags de mapeamento bsicohibernate-mapping>Elemento raiz. Sempre presente

    Usada dentro de Define mapeamento de uma classe a tabelaPode haver vrios em um mas a conveno recomendada haver apenas um por arquivo

    Mapeamento de identidade (coluna de chave-primria a uma propriedade de identidade da classe)Usada dentro de

    Usado dentro de para gerar chaves primrias

    Mapeamento simples de propriedade - coluna

  • RefernciasHibernate in Action

  • ExercicioTestar o exemplo mostradoTestar as demais operaes do session mostradasload()createQuery().find()

  • ExercicioImplementar suporte a persistncia para a seguinte classe (Criar classe, tabela e mapeamento)

    Implemente um DAO para a classe User usando o HibernateE teste-o!

  • Hibernate Introduo rpidaJobson Ronan {[email protected]}