Curso de Hibernate 34066

Embed Size (px)

Citation preview

  • 8/3/2019 Curso de Hibernate 34066

    1/217

    Curso: Persistncia em Java com

    Hibernate

    Instrutor: Fabrcio Lemos 23/04/2007

  • 8/3/2019 Curso de Hibernate 34066

    2/217

    Persistncia

    um tpico vital para o desenvolvimento deaplicaes

    Quase todas as aplicaes necessitam que dadossejam persistidos

    Necessidades

    Armazenamento

    Busca

    Organizao

    Compartilhamento dos dados

  • 8/3/2019 Curso de Hibernate 34066

    3/217

    Persistncia

    Necessidades

    Integridade dos dados

    Controle de concorrncia Performance e a escalabilidade so fortemente

    afetadas pela estratgia de acesso a dadosescolhida

  • 8/3/2019 Curso de Hibernate 34066

    4/217

    Banco de Dados Relacionais

    Geralmente so utilizados banco de dados SQL

    Flexvel

    Robusto Eficiente

    Confivel

    Maneira mais utilizada e conhecida de armazenar

    dados

  • 8/3/2019 Curso de Hibernate 34066

    5/217

    Banco de Dados Relacionais

    Dados so armazenados de forma independente

    Independncia de linguagem

    Independncia de aplicao Os dados geralmente possuem longevidade maior

    do que as aplicaes que os acessam

    A utilizao de algum framework no elimina anecessidade de conhecimento de SQL e domodelo relacional

  • 8/3/2019 Curso de Hibernate 34066

    6/217

    Persistindo dados com Java

    Realizado atravs da API Java DatabaseConnectivity (JDBC)

    Tarefas de baixo nvel Preparar consultas

    Associar parmetros

    Executar a consulta

    Percorrer e retornar o resultado

    Tarefas de alto nvel

    Salvar e recuperar objetos

  • 8/3/2019 Curso de Hibernate 34066

    7/217

    Persistindo objetos com Java(ou qualquer outra linguagem OO)

    Linguagem orientada a objetos

    Deve-se poder armazenar o estado de um objeto,

    mesmo aps o objeto ser destrudo Deve ser possvel criar um novo objeto com o

    mesmo estado do anterior

    Operaes no devem ser limitadas a um nicoobjeto Associaes devem ser salvas

  • 8/3/2019 Curso de Hibernate 34066

    8/217

    Persistindo objetos com Java

    A aplicao deve trabalhar diretamente comobjetos, ao invs de linhas e colunas da base dedados

    Lgica de negcio deve ser implementada naaplicao, utilizando-se Java, e no diretamentena base de dados

    Limitar o uso de stored procedures Conceitos da Orientao a Objetos no devem ser

    restringidos pela soluo adotada

  • 8/3/2019 Curso de Hibernate 34066

    9/217

    Diferena dos Paradigmas:

    OO/Relacional Granularidade

    Objetos de baixa granularidade podem ser persistidosem tabelas de grande granularidade ou vice-versa Uma tabela armazena diversos tipos de objetos

    Um objeto armazenado em diversas tabelas

    Herana

    Modelo relacional no possui o conceito de herana

  • 8/3/2019 Curso de Hibernate 34066

    10/217

    Diferena dos Paradigmas

    Polimorfismo

    Necessidade de um objeto referenciar outros atravsde superclasses

    Uma referncia pode estar associada o objetos detipos diferentes

    Chaves estrangeiras referenciam uma tabelaespecfica

  • 8/3/2019 Curso de Hibernate 34066

    11/217

    Diferena dos Paradigmas

    OO/Relacional Identidade dos objetos

    Java Operador ==

    Mtodo equals()

    Banco de dados Chave primria

    Atualizao de algum atributo que faz parte da chaverequer que outras tabelas sejam atualizadas

  • 8/3/2019 Curso de Hibernate 34066

    12/217

    Diferena dos Paradigmas

    OO/Relacional Associaes

    OO possui associaes unidirecionais e bidirecionais

    Junes de tabelas e projees no possuem oconceito de direo de uma associao

    Associaes em OO podem ser do tipo many-to-many

    Associaes entre tabelas s podem ser one-to-many e

    one-to-one Necessidade de criar uma tabela de relacionamento para

    associaes many-to-many

    Tabela no presente no modelo do domnio da aplicao

  • 8/3/2019 Curso de Hibernate 34066

    13/217

    Diferena dos Paradigmas: Custo

    Necessrio escrever muito cdigo para (tentar)contornar o problema

    Cdigo se torna repetitivo e de difcil manuteno

    A escrita de cdigo SQL pode tornar a aplicaodependente do banco de dados

    Modelagem dos objetos fica prejudicada

    Outras camada ficam fortemente acopladas Camada de Persistncia

    Produtividade pode ser fortemente afetada

  • 8/3/2019 Curso de Hibernate 34066

    14/217

    Estratgias de Persistncia

    JDBC e SQL

    Faz parte da plataforma Java

    Necessrio escrever bastante cdigo de baixo nvel Stored Procedures

    Lgica de negcio sai da aplicao e vai para a basede dados

    Perde-se a portabilidade

  • 8/3/2019 Curso de Hibernate 34066

    15/217

    Estratgias de Persistncia

    Framework corporativo

    Necessrio grande esforo da empresa

    Demora-se muito para que a soluo implementadaatinga maturidade

    Documentao muitas vezes esquecida

    Falta de suporte

  • 8/3/2019 Curso de Hibernate 34066

    16/217

    Estratgias de Persistncia

    Java Persistence API (JPA)

    Especificao elaborada pelo Java CommunityProcess para persistncia em Java

    Baseou-se em diversas solues existentes

    Frameworks existentes passaram a implementar aespecificao

    Recursos so um sub-conjunto dos encontrados nosframeworks que a implementam

    Atualizaes so lentas e burocrticas

  • 8/3/2019 Curso de Hibernate 34066

    17/217

    Estratgias de Persistncia

    Frameworks de terceiros

    TopLink Framework de persistncia Objeto/Relacional

    Desenvolvido pela Oracle

    Gratuito para avaliao e nas fases de desenvolvimento

    Hibernate

  • 8/3/2019 Curso de Hibernate 34066

    18/217

    Hibernate

    Framework de mapeamento Objeto-Relacional

    Preenche a lacuna entre a base de dadosrelacional e a aplicao orientada a objetos

    Framework de persistncia Java mais utilizado edocumentado

    Mantido pela Jboss sob a licensa LGPL

    Suporta classes desenvolvidas com agregao,herana, polimorfismo, composio e colees

  • 8/3/2019 Curso de Hibernate 34066

    19/217

    Hibernate

    Permite a escrita de consultas tanto atravs deuma linguagem prpria (HQL) como tambmatravs de SQL

    Framework no intrusivo No restringe a arquitetura da aplicao

    Implementa a especificao Java Persistence API

    Grande e ativa comunidade Mais de 25 mil desenvolvedores registrados nos

    foruns oficiais

  • 8/3/2019 Curso de Hibernate 34066

    20/217

    Mapeamento Objeto Relacional

    Permite a persistncia de objetos em tabelas deuma base de dados relacional

    Automtica e Transparente

    Utiliza metadados para descrever orelacionamento entre os objetos e a base de dados

    XML

    Xdoclet Annotations

  • 8/3/2019 Curso de Hibernate 34066

    21/217

    Mapeamento Objeto Relacional

    O SQL gerado automaticamente a partir dosmetadados

    A escrita e manuteno de metadados necessitade esforo nas etapas de implementao Esforo bem menor do que o necessrio para fazer a

    converso manualmente

    A converso entre os tipos de representao podetrazer perca de performance

    Ferramentas maduras otimizam a converso emdiversos pontos

  • 8/3/2019 Curso de Hibernate 34066

    22/217

    Mapeamento Objeto Relacional

    Possui quatro partes principais

    API para realizao de operaes bsicas (CRUD)

    Linguagem ou API para a realizao de consultas

    Maneira para a especificao de metadados

    Tcnicas de otimizao Dirty checking

    Carregamento tardio (lazy association fetching)

  • 8/3/2019 Curso de Hibernate 34066

    23/217

    Mapeamento Objeto Relacional:Vantagens

    Produtividade

    Elimina a necessidade de escrita de grande parte docdigo relativo a persistncia

    Maior tempo disponvel para implementar a lgica daaplicao

    Manutenibilidade

    Menos cdigo Maior entendimento da aplicao

    Camada de abstrao

    Facilita a refatorao

  • 8/3/2019 Curso de Hibernate 34066

    24/217

    Vantagens Performance

    Tarefas manuais nem sempre tem performancemelhor do que tarefas automatizadas Considerando limitaes de custo e tempo

    Frameworks maduros so bastantes otimizados

    Com o aumento de produtividade, voc pode dedicarmais tempo para resolver possveis gargalos

    Portabilidade Independncia nem sempre algo simples de ser

    alcanado, mesmo em aplicaes Java

    Suporte a diversos tipos de banco de dados

  • 8/3/2019 Curso de Hibernate 34066

    25/217

    Hibernate: Mdulos

    Hibernate Core

    Contm os servios bsicos

    Metadados escritos em XML

    Consultas HQL: Hibernate Query Language

    Interfaces utilizando critrios e exemplos

    No depende de outros mdulos No depende de uma verso especfica do JDK

    Executvel em qualquer servidor Web e/ou deAplicao e tambm em aplicaes desktop

  • 8/3/2019 Curso de Hibernate 34066

    26/217

    Mdulos

    Hibernate Annotations

    Permite a escrita de metadados atravs de Annotations

    Beneficia-se da tipagem do Java

    Compatvel com refatoraes de cdigo

    Semntica familiar para quem j est acostumado commetadados em XML

    Utiliza as Annotations da especificao JPA Possui Annotations prprias para configuraes

    avanadas no presentes na especificao

    Necessita do JDK 5.0

  • 8/3/2019 Curso de Hibernate 34066

    27/217

    Mdulos

    Hibernate Entity Manager

    Implementao da especificao JPA

    Permite a escrita de cdigo compatvel com qualquerframework de persistncia que implemente aespecificao

    Utiliza o pacote javax.persistence

    No disponibiliza todas as funcionalidades doHibernate

  • 8/3/2019 Curso de Hibernate 34066

    28/217

    Separao em camadas

    uma boa prtica dividir aplicaes de mdio egrande porte em camadas

    Padro Layers (Pattern-Oriented Software

    architecture) Diviso mais utilizada

    Apresentao

    Negcio Persistncia

  • 8/3/2019 Curso de Hibernate 34066

    29/217

    Separao em camadas

    Permite a especificao de intefaces para osdiversos tipos de servios

    A implementao pode ser mudada sem afetar

    significativamente o cdigo de outras camadas A comunicao ocorre das camadas superiores

    para as camadas inferiores

    Uma camada s depende da camadaimediatamente inferior

    Camada de apresentao no sabe da existncia dacamada de persistncia

  • 8/3/2019 Curso de Hibernate 34066

    30/217

  • 8/3/2019 Curso de Hibernate 34066

    31/217

    Criando um projeto

  • 8/3/2019 Curso de Hibernate 34066

    32/217

    Next >....

  • 8/3/2019 Curso de Hibernate 34066

    33/217

    Finish

  • 8/3/2019 Curso de Hibernate 34066

    34/217

    Adicionando as bibliotecas

  • 8/3/2019 Curso de Hibernate 34066

    35/217

    Criando uma entidade@Entity@Table(name = "MESSAGES")

    publicclass Message {

    @Id@GeneratedValue@Column(name = "MESSAGE_ID")

    private Long id;

    @Column(name = "MESSAGE_TEXT")private String text;

    @ManyToOne(cascade = CascadeType.ALL)@JoinColumn(name = "NEXT_MESSAGE_ID")

    private Message nextMessage;

    private Message() {}

    public Message(String text) {this.text = text; }

    //gets e sets}

  • 8/3/2019 Curso de Hibernate 34066

    36/217

    Annotations da classe

    Entity

    Informa que a classe pode ser persistida peloHibernate

    Table

    Informa o nome da tabela em que os objetos da classedevem ser armazenados

    @Entity@Table(name ="MESSAGES")

    publicclass Message {

  • 8/3/2019 Curso de Hibernate 34066

    37/217

    Construtores

    Obrigatrio um construtor sem argumentos

    private Message() {}

    public Message(Stringtext) {

    this.text = text; }

  • 8/3/2019 Curso de Hibernate 34066

    38/217

    Propriedades

    Representa o identificador do objeto

    Preenchido automaticamente quando o objeto salvo

    Mapeado para a chave primria da tabela

    Se duas instncias tiverem o mesmo identificador,elas representam a mesma linha da tabela

    @Id@GeneratedValue@Column(name =

    "MESSAGE_ID")private Long id;

  • 8/3/2019 Curso de Hibernate 34066

    39/217

    Atributos

    O atributo text armazenado na colunaMESSAGE_TEXT

    @Column(name ="MESSAGE_TEXT")

    private String text;

    O atributo nextMessage uma associao many-to-

    one Mapeado pela chave estrangeira

    NEXT_MESSAGE_ID

    @ManyToOne(cascade =CascadeType.ALL)

    @JoinColumn(name ="NEXT_MESSAGE_ID")

    private Message nextMessage;

  • 8/3/2019 Curso de Hibernate 34066

    40/217

    Transparncia No h a necessidade de se herdar de uma

    superclasse ou de implementar um interface

    POJO - Plain Ordinary Java Objects

    Classes podem ser reutilizadas fora do contextode persistncia

    Interface com o usurio

    Testes de unidades

    As entidades no precisam nem saber que seropersistidas

    Grande nvel de portabilidade

  • 8/3/2019 Curso de Hibernate 34066

    41/217

    Configurando o Hibernate

    Configurao feita atravs do arquivohibernate.cfg.xml

    Deve estar localizado na raiz do classpath

    Localizao default Para projetos maven, utilizar a pasta

    src/main/resources

    Configuraes contm

    Parmetros de acesso a base de dados

    Pool de conexes

    Entidades a serem persistidas

  • 8/3/2019 Curso de Hibernate 34066

    42/217

  • 8/3/2019 Curso de Hibernate 34066

    43/217

    hibernate.cfg.xml...

    520300503000

    true

  • 8/3/2019 Curso de Hibernate 34066

    44/217

    Armazenando uma Mensagem

    //Obtendo o SessionSession session = HibernateUtil.getSessionFactory().openSession();

    //Iniciando a transaoTransaction tx = session.beginTransaction();

    // Criando uma mensagemMessage message = new Message("Hello World");

    // Salvando a MensagemLong msgId = (Long) session.save(message);

    //Fazendo o commit da transao

    tx.commit();

    //Fechando o Sessionsession.close();HibernateUtil.shutdown();

  • 8/3/2019 Curso de Hibernate 34066

    45/217

    Objetos utilizados

    Session

    Contm mtodos utilizados para armazenar erecuperar entidades

    Armazena uma lista de comandos SQL que seroexecutados, em algum momento, na base de dados

    Mantm as entidades gerenciadas pelo Hibernate Recuperadas, inseridas ou atualizadas atravs do Session

    nico para cada thread

  • 8/3/2019 Curso de Hibernate 34066

    46/217

    Objetos utilizados

    Transaction

    Utilizado para delimitar as transaes com a base dedados

    Geralmente gerenciado pelo container EJB

    Spring

    SessionFactory

    Utilizado para criar os Session

    Reutilizvel por toda a aplicao

  • 8/3/2019 Curso de Hibernate 34066

    47/217

    HibernateUtil

    publicclass HibernateUtil {

    privatestatic SessionFactory sessionFactory;

    static {sessionFactory= new

    AnnotationConfiguration().configure().buildSessionFactory();

    }

    publicstatic SessionFactory getSessionFactory() {returnsessionFactory;

    }

    publicstaticvoidshutdown() {getSessionFactory().close();

    }}

  • 8/3/2019 Curso de Hibernate 34066

    48/217

    Recuperando as MensagensSession newSession = HibernateUtil.getSessionFactory().openSession();Transaction newTransaction = newSession.beginTransaction();

    //Criando e executando uma consultaQuery query = newSession

    .createQuery("from Message m order by m.text asc");List messages = query.list();

    //Retornando a quantidade de mensagens encontradasSystem.out.println(messages.size() + " message(s) found:");

    //Retornando as mensagens encontradasfor (Message msg : messages) {

    System.out.println(msg.getText());

    }

    newTransaction.commit();newSession.close();HibernateUtil.shutdown();

  • 8/3/2019 Curso de Hibernate 34066

    49/217

    Objetos Utilizados

    Query

    Cria as consultas

    Associa os parmetros

    Executa as consultas

  • 8/3/2019 Curso de Hibernate 34066

    50/217

    Dirty Checking e CascadeSession thirdSession =

    HibernateUtil.getSessionFactory().openSession();Transaction thirdTransaction = thirdSession.beginTransaction();

    // recuperando a mensagemmessage = (Message) thirdSession.get(Message.class, msgId);

    //Alterando o textomessage.setText("Greetings Earthling");

    //Criando uma nova mensagem e associando antigamessage.setNextMessage(new Message("Take me to your leader"));

    thirdTransaction.commit();thirdSession.close();HibernateUtil.shutdown();

  • 8/3/2019 Curso de Hibernate 34066

    51/217

  • 8/3/2019 Curso de Hibernate 34066

    52/217

  • 8/3/2019 Curso de Hibernate 34066

    53/217

    Porque no usar XML

    Pode ser tornar pouco legvel e de difcil edio

    Requer maior digitao

    Falta de valores default para atributos e elementos

    No necessariamente mais flexvel e mais fcil demanter do que cdigo Java

    Mais fcil encontrar um bom editor Java do que

    um bom editor de XML

  • 8/3/2019 Curso de Hibernate 34066

    54/217

    Metadados com Annotations

    A meta-informao fica perto dos dados que eladescreve

    Compatvel com refatorao de cdigo

    Renomear, deletar e remover classes e propriedades

    Sem necessidade de fazer parser em XML

    Inicializao mais rpida

    Lido atravs de reflection na inicializao doHibernate

    Disponvel a partir da JDK 5.0

  • 8/3/2019 Curso de Hibernate 34066

    55/217

    Mapeando Propriedades

    Ao mapear uma classe atravs da Annotation@Entity, todas as propriedades seroconsideradas persistentes

    Propriedades no persistentes devem receber aAnnotation @Transientou o modificadortransient

    Por default, o nome da coluna ser o mesmo dapropriedade

    Meio de acesso o mesmo do @ID

    Definido na propriedade ou no mtodo get()

  • 8/3/2019 Curso de Hibernate 34066

    56/217

    @Column

    Aplicvel para propriedades simples

    Atributos

    name Nome da coluna a qual a propriedade mapeada

    unique Se o valor deve ser nico ou no

    nullable Se a propriedade pode ser nula ou no

  • 8/3/2019 Curso de Hibernate 34066

    57/217

    M d P i d d Ti

  • 8/3/2019 Curso de Hibernate 34066

    58/217

    Mapeando Propriedades: Tipos

    D

  • 8/3/2019 Curso de Hibernate 34066

    59/217

    Datas

    Propriedades podem ser do tipojava.util.Date oujava.util.Calendar

    Preciso default TIMESTAMP

    Preciso pode ser alterada atravs da Annotation@Temporal

    @Temporal(TemporalType.DATE)private Date date1;

    @Temporal(TemporalType.TIME)private Date date2;

    @Temporal(TemporalType.TIMESTAMP)private Date date3;

    Id tid d d E tid d

  • 8/3/2019 Curso de Hibernate 34066

    60/217

    Identidade das Entidades

    Identidade versus Equivalncia em Java Identidade

    Operador ==

    Definido pela mquina virtual

    Dois objetos so idnticos se eles apontam para o mesmolocal da memria

    Equivalncia Definida pelas classes que sobreescrevem o mtodo

    equals() Dois objetos diferentes possuem o mesmo valor

    Dois objetos String podem ter a mesma seqncia decaracteres

    Id tid d d E tid d

  • 8/3/2019 Curso de Hibernate 34066

    61/217

    Identidade das Entidades

    Identidade na base de dados

    Duas Entidades so idnticas se elas representam amesma linha na base de dados

    Se so armazenadas na mesma tabela e possuem a mesmachave primria

    Adi i d Id tifi d

  • 8/3/2019 Curso de Hibernate 34066

    62/217

    Adicionando um Identificador

    O valor gerado automaticamente pelo Hibernate

    No deve ser mudado pela aplicao

    @Entity

    @Table(name="CATEGORY")publicclass Category {

    @Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "CATEGORY_ID")

    private Long id;

    public Long getId() { returnid; }}

    E lh d h i i

  • 8/3/2019 Curso de Hibernate 34066

    63/217

    Escolhendo a chave primria

    Uma chave candidata uma coluna, ou umconjunto de colunas, que pode ser utilizada paraidentificar um registro na base de dados

    Requisitos O valor nunca deve ser nulo

    Cada registro deve ter um valor nico

    O valor nunca deve mudar

    Escolhendo a chave primria

  • 8/3/2019 Curso de Hibernate 34066

    64/217

    Escolhendo a chave primria

    Chaves naturais so aquelas que possuemsignificado para o domnio da aplicao

    CPF de um usurio

    Seqencial gerado pela aplicao Dificilmente chaves naturais atendem os

    requisitos necessrios

    Escolhendo a chave primria

  • 8/3/2019 Curso de Hibernate 34066

    65/217

    Escolhendo a chave primria

    Chaves cegas

    Melhor alternativa

    No possuem significado para o domnio da aplicao

    Geradas pelo banco de dados ou pela aplicao

    Gerao automtica de chaves

  • 8/3/2019 Curso de Hibernate 34066

    66/217

    Gerao automtica de chaves

    Hibernate suporta diversas estratgias paragerao automtica de chaves

    A estratgia deve ser especificada atravs da

    Annotations @GeneratedValue

    Estratgias

  • 8/3/2019 Curso de Hibernate 34066

    67/217

    Estratgias

    IDENTITY

    Suporte para colunas IDENTITY nos bancos de dadosDB2, MySQL, MS SQL Server, Sybase e

    HypersonicSQL Os tipos devem ser long, shortou int

    SEQUENCE

    Utiliza um Sequence para a gerao de chaves

    Suporte para DB2, PostgreSQL e Oracle dentreoutros

    Nome default da sequence hibernate_sequence

    Estratgias

  • 8/3/2019 Curso de Hibernate 34066

    68/217

    Estratgias

    increment

    Na inicializao o Hibernate l qual o maior valorpara a chave da tabela

    O valor atribudo e incrementado em cada insero No deve ser utilizado se o Hibernate no tiver acesso

    exclusivo para a base de dados

  • 8/3/2019 Curso de Hibernate 34066

    69/217

    Mapeando Componentes

  • 8/3/2019 Curso de Hibernate 34066

    70/217

    Mapeando Componentes

    Entidades so classes persistentes querepresentam objetos do domnio da aplicao

    Possuem identidade prpria

    Hibernate suporta a construo de um modelo deobjetos de alta granularidade

    Propriedades de uma Entidade podem serencapsuladas em outros objetos Tais objetos no possuem identidade prpria

    Chamados de Objetos Valores ou Componentes

    Mais classes do que tabelas

    Mapeando Componentes

  • 8/3/2019 Curso de Hibernate 34066

    71/217

    Mapeando Componentes

    Mapeando Componentes

  • 8/3/2019 Curso de Hibernate 34066

    72/217

    Mapeando Componentes

    User

    Representa uma Entidade

    Possui identidade prpria Chave primria na base de dados

    Uma referncia para User persistida como umachave estrangeira

    Tem seu prprio ciclo de vida Existe independentemente de qualquer outra entidade

  • 8/3/2019 Curso de Hibernate 34066

    73/217

    Mapeando Componentes

  • 8/3/2019 Curso de Hibernate 34066

    74/217

    Mapeando Componentes

    @Embeddablepublicclass Address {

    @Column(name = "ADDRESS_STREET", nullable = false)private String street;

    @Column(name = "ADDRESS_CITY", nullable = false)private String city;

    //gets e sets...}

    Mapeando Componentes

  • 8/3/2019 Curso de Hibernate 34066

    75/217

    Mapeando Componentes

    @Entity@Table(name = "USERS")

    publicclass User {

    @Id@GeneratedValue(strategy=GenerationType.AUTO)

    private Long id;

    private String name;

    private String email;

    private Address address;

    //gets e sets}

    Mapeando Herana

  • 8/3/2019 Curso de Hibernate 34066

    76/217

    Mapeando Herana

    A utilizao de uma tabela para cada entidade nofunciona to bem para heranas entre entidades

    Bancos de dados SQL, de maneira geral, no

    possuem o conceito de herana Solues proprietria podem comprometer a

    portabilidade da aplicao

    Estratgias

  • 8/3/2019 Curso de Hibernate 34066

    77/217

    a g a

    Tabela por classe concreta

    Tabela por classe concreta, utilizando juno

    Tabela por hierarquia

    Tabela por classe (concreta ou no)

    Uma tabela por Classe Concreta:M d l

  • 8/3/2019 Curso de Hibernate 34066

    78/217

    Modelagem

    Uma tabela por Classe Concreta

  • 8/3/2019 Curso de Hibernate 34066

    79/217

    p

    Estratgia mais simples

    Todas propriedades de uma classe, incluindo asherdadas, so mapeadas para a mesma tabela

    Mapeamento convencional pode ser utilizado No suporta associaes polimrficas

    adequadamente

    Associao para classe abstrata necessitaria que achave estrangeira referenciasse duas tabelas

    Uma tabela por Classe Concreta

  • 8/3/2019 Curso de Hibernate 34066

    80/217

    p

    Diferentes colunas em diferentes tabelaspassariam a possuir a mesma semntica

    Recomendvel somente para a hierarquia superior

    Associaes polimrficas geralmente no necessriase no recomendadas

    Modificaes na superclasse so muito raras

    select CREDIT_CARD_ID, OWNER, NUMBER, EXP_MONTH, EXP_YEAR ...from CREDIT_CARD

    select BANK_ACCOUNT_ID, OWNER, ACCOUNT, BANKNAME, ...from BANK_ACCOUNT

    Mapeando a Superclasse

  • 8/3/2019 Curso de Hibernate 34066

    81/217

    p p

    @MappedSuperclasspublicabstractclass BillingDetails {

    @Column(name = "OWNER", nullable = false)private String owner;

    //gets e sets...}

    Mapear a super classe atravs da Annotattion@MappedSuperclass

    Mapeando as Subclasses

  • 8/3/2019 Curso de Hibernate 34066

    82/217

    p

    Nenhuma configurao extra necessria

    @Entitypublicclass BankAccount extends BillingDetails{

    @Id@GeneratedValue

    private Long id;

    private Integer account;

    private Stringbank;}

    Mapeando as Subclasses

  • 8/3/2019 Curso de Hibernate 34066

    83/217

    p

    Mapeamento das propriedades herdadas pode seralterado

    Adicionar a Annotation @AttributeOverride

    @Entity@AttributeOverride(name = "owner", column = @Column(name =

    "CC_OWNER", nullable = false))publicclass CreditCardextends BillingDetails {

    @Id@GeneratedValue

    private Long id;

    private String number; }

    Uma tabela por Classe Concreta:Union

  • 8/3/2019 Curso de Hibernate 34066

    84/217

    Union Com a utilizao de consultas com Union, alguns

    problemas podem ser eliminados

    Suporte a associaes polimrficas

    Hibernate utiliza o Union para simular uma nicatabela

    As subclasses herdam o Id da super-classe

  • 8/3/2019 Curso de Hibernate 34066

    85/217

    Mapeando as Subclasses

  • 8/3/2019 Curso de Hibernate 34066

    86/217

    @Entity

    publicclass CreditCardextends BillingDetails{

    @Column(name = "CC_NUMBER")private String number;

    }

    No necessrio mapear o identificador O Identificador mapeado na super-classe

    Tabela por Hierarquia

  • 8/3/2019 Curso de Hibernate 34066

    87/217

    Tabela por Hierarquia

  • 8/3/2019 Curso de Hibernate 34066

    88/217

    Toda uma hierarquia mapeada em uma nicatabela

    A tabela possui colunas para todas as

    propriedades de todas as entidades da hierarquia A subclasse de cada registro identificada atravs

    de uma coluna discriminatria

    Vantagem Possui a melhor performance

    Tabela por Hierarquia

  • 8/3/2019 Curso de Hibernate 34066

    89/217

    Desvantagens Valores para colunas das subclasses devem sempre

    permitir NULL

    Perca da restrio NOT NULL Dados so desnormalizados

  • 8/3/2019 Curso de Hibernate 34066

    90/217

    Tabela por classe

  • 8/3/2019 Curso de Hibernate 34066

    91/217

    Tabela por classe

  • 8/3/2019 Curso de Hibernate 34066

    92/217

    Uma tabela para todas as classes, incluindo asabstratas, que possuem propriedades para serempersistidas

    Relao de herana representada por uma chaveestrangeira

    As tabelas no contm colunas para aspropriedades herdadas

    A chave primria tambm uma chaveestrangeira para a super classe

    Tabela por classe

  • 8/3/2019 Curso de Hibernate 34066

    93/217

    Vantagens Os dados so normalizados

    Restries podem ser mantidas

    Desvantagens Performance pode ser muito baixa para hierarquias

    complexas Necessidade de muitas junes

    Mapeando a Superclasse

  • 8/3/2019 Curso de Hibernate 34066

    94/217

    @Entity@Inheritance(strategy = InheritanceType.JOINED)

    publicabstractclass BillingDetails {

    @Id@GeneratedValue@Column(name = "BILLING_DETAILS_ID")

    private Long id= null;

    @Column(name = "OWNER", nullable = false)private String owner;

    }

    O valor do atributo strategy deve ser mudado paraInheritanceType.JOINED

    Mapeando as Subclasses

  • 8/3/2019 Curso de Hibernate 34066

    95/217

    @Entitypublicclass CreditCardextends BillingDetails{

    @Column(name = "CC_NUMBER")private String number;

    }

    Id mapeado na super-classe

    Escolhendo a melhor estratgia

  • 8/3/2019 Curso de Hibernate 34066

    96/217

    Tabela por classe concreta, utilizando juno Se associaes ou consultas polimrficas nunca ou

    raramente so utilizadas

    Tabela por hierarquia Se associaes ou consultas polimrficas so

    utilizadas e

    Se as subclasses declaram poucas propriedades Maior diferena entre as subclasses o comportamento

    Escolhendo a Melhor Estratgia

  • 8/3/2019 Curso de Hibernate 34066

    97/217

    Tabela por Classe Se associaes ou consultas polimrficas so

    utilizadas e

    Se as subclasses declaram muitas propriedades Maior diferena entre as subclasses so os dados que elas

    armazenam

    Se a largura e o comprimento da hierarquia no formuito grande

    Mapeando colees

  • 8/3/2019 Curso de Hibernate 34066

    98/217

    Objetos podem possuir colees As colees podem ter duas naturezas

    Colees de valores Tipos primitivos Componentes

    Colees de entidades

    Coleo de tipos primitivos: Set

  • 8/3/2019 Curso de Hibernate 34066

    99/217

    Um Item possui um conjunto de imagens Somente o nome da imagem persistido

    Nomes no devem ser duplicados para um

    determinado Item

    Annotations

  • 8/3/2019 Curso de Hibernate 34066

    100/217

    @CollectionOfElements Utilizada para colees de tipos primitivos ou para

    colees de objetos valores

    @JoinTable

    Informa a tabela em que a coleo persistida

    Atributos Name

    Nome da tabela JoinColumns

    Coluna que chave estrangeira Chave estrangeira referencia a tabela da entidade que possui a coleo

    Annotations

  • 8/3/2019 Curso de Hibernate 34066

    101/217

    @JoinColumn o tipo do atributoJoinColumns da Annotation

    @JoinTable

    Annotation dentro de outra Annotation

    Mapeia a coluna utilizada para junes

    Atributos Name

    Nome da coluna

    Classe Item

  • 8/3/2019 Curso de Hibernate 34066

    102/217

    @Entitypublicclass Item {

    @Id @GeneratedValue@Column(name = "ITEM_ID")

    private Long id;

    private String name;

    @CollectionOfElements@JoinTable(name = "ITEM_IMAGE", joinColumns = @JoinColumn(name

    = "ITEM_ID"))@Column(name = "FILENAME", nullable = false)

    private Setimages = new HashSet();}

    Coleo de tipos primitivos: List

  • 8/3/2019 Curso de Hibernate 34066

    103/217

    Caso a aplicao necessite guardar a ordem doselementos

    Necessrio uma coluna para informar a posio

    de cada elemento

    Classe Item

  • 8/3/2019 Curso de Hibernate 34066

    104/217

    @Entitypublicclass Item {...

    @CollectionOfElements@JoinTable(name = "ITEM_IMAGE", joinColumns = @JoinColumn(name

    = "ITEM_ID"))@Column(name = "FILENAME", nullable = false)

    @IndexColumn(name = "POSITION")private Listimages = new ArrayList();}

    Deve-se adicionar a Annotation @IndexColumn

    Coleo de tipos primitivos: Map

  • 8/3/2019 Curso de Hibernate 34066

    105/217

    Se o Item possuir um Map de imagens necessrio guardar o elemento e sua chave

    Classe Item

  • 8/3/2019 Curso de Hibernate 34066

    106/217

    @Entitypublicclass Item {...

    @CollectionOfElements@JoinTable(name = "ITEM_IMAGE", joinColumns =

    @JoinColumn(name = "ITEM_ID"))

    @Column(name = "FILENAME", nullable = false)@MapKey(columns = @Column(name = "IMAGENAME"))private Mapimages = new HashMap();}

    Utilizar a Annotation @MapKey Atributo columns informa o nome da coluna que

    armazena a chave

    Associao entre Entidades

  • 8/3/2019 Curso de Hibernate 34066

    107/217

    Podem ser de diversas multiplicidades One-to-many

    One-to-one

    Many-to-many Many-to-one

    Tambm so implementadas atravs de atributos

    Para associaes one-to-many e many-to-many necessrio a utilizao de colees

    Implementando associaes

  • 8/3/2019 Curso de Hibernate 34066

    108/217

    Colees devem ser acessadas atravs de suasInterfaces

    Set, ao invs de HashSet

    List, ao invs de ArrayList

    Associaes Bidirecionais

  • 8/3/2019 Curso de Hibernate 34066

    109/217

    Os dois lados da associao devem estarconsistentes

    Necessrio mesmo para aplicaes que no usamHibernate

    Classe Category

  • 8/3/2019 Curso de Hibernate 34066

    110/217

    publicclass Category {

    private String name;

    private CategoryparentCategory;

    private SetchildCategories = newHashSet();

    //gets e sets//...

    }

    Mantendo a Consistncia

  • 8/3/2019 Curso de Hibernate 34066

    111/217

    Category aParent = new Category();Category aChild = new Category();

    aChild.setParentCategory(aParent);aParent.getChildCategories().add(aChild);

    Relacionamento Pai-Filho

  • 8/3/2019 Curso de Hibernate 34066

    112/217

    Classe Bid

  • 8/3/2019 Curso de Hibernate 34066

    113/217

    Relaciona-se a somente um Item Mapeamento realizado atravs da Annotation

    @ManyToOne

    Annotation @JoinColumn informa qual a chaveestrangeira

    Atributo name

    Nome da coluna

    Atributo nullable

    Se o relacionamento opcional ou no

    Classe Bid

  • 8/3/2019 Curso de Hibernate 34066

    114/217

    @Entitypublicclass Bid {

    @Id@GeneratedValue@Column(name = "BID_ID")

    private Long id;

    private Integer amount;

    @ManyToOne@JoinColumn(name = "ITEM_ID", nullable = false)

    private Itemitem;}

    Relacionamento Bidirecional

  • 8/3/2019 Curso de Hibernate 34066

    115/217

    O relacionamento pode ou no ser declaradocomo bidirecional

    Para relacionamentos bidirecionais o outro ladoda associao mapeado com a Annotationinversa @OneToMany no caso de Item

    Classe Bid utiliza a Annotation @ManyToOne

  • 8/3/2019 Curso de Hibernate 34066

    116/217

    Relacionamento Bidirecional

  • 8/3/2019 Curso de Hibernate 34066

    117/217

    @OneToMany(mappedBy = "item")

    Detalhes do mapeamento so configurados no outro ladoda associao Atravs da Annotation @ManyToOne

    Quando as referncias de uma associao mudam,as duas propriedades so alteradas

    bid.setItem(item);

    item.getBids().add(bid);

    Relacionamento Bidirecional

  • 8/3/2019 Curso de Hibernate 34066

    118/217

    Na base de dados somente uma atualizaoprecisa ser feita

    Atualizao da chave estrangeira

    Hibernate no precisa executar dois comandosUPDATE

    Uma das alteraes sincronizada e a outra ignorada

    No h efeito colateral se as associaes estiveremconsistentes

    Relacionamento Bidirecional

  • 8/3/2019 Curso de Hibernate 34066

    119/217

    O lado que contm os detalhes do mapeamento o lado que sincronizado

    Relacionamentos many-to-one ou one-to-many Lado Many sincronizado

    Relacionamento one-to-one Lado que possuir a chave estrangeira sincronizado

    Relacionamento many-to-many

    Lado que mapear a tabela de juno sincronizado Os lados do relacionamento no sincronizados

    possuem o atributo mappedBy na Annotation

    Relacionamento Bidirecional

  • 8/3/2019 Curso de Hibernate 34066

    120/217

    Bid bid = new Bid();bid.setAmount(Integer.valueOf(1000));

    Item item = new Item();item.setName("computador");

    bid.setItem(item);

    item.getBids().add(bid);

    Session session = HibernateUtil.getSessionFactory().openSession();Transaction transaction = session.beginTransaction();

    //O item tem que ser salvo primeirosession.save(item);

    session.save(bid);

    Relacionamento One-to-One

  • 8/3/2019 Curso de Hibernate 34066

    121/217

    One-to-One

  • 8/3/2019 Curso de Hibernate 34066

    122/217

    O atributo deve conter a Annotation @OneToOne Se o relacionamento for bidirecional os dois

    atributos devem conter a Annotation

    Em uma das propriedades deve ser adicionada aAnnotation @JoinColumn

    Na outra propriedade deve ser adicionado oatributo mappedBy Annotation @OneToOne

    Classe User

  • 8/3/2019 Curso de Hibernate 34066

    123/217

    @Entity@Table(name = "USERS")publicclass User {

    @Id@GeneratedValue(strategy=GenerationType.AUTO)

    private Long id;private String name;

    @OneToOne@JoinColumn(name = "SHIPPING_ADDRESS_ID")

    private Address address;}

    Classe Address

    @

  • 8/3/2019 Curso de Hibernate 34066

    124/217

    @Entitypublicclass Address {

    @Id@GeneratedValueprivate Long id;

    @Column(nullable = false)private String street;

    @OneToOne(mappedBy = "address")private User user;

    }

    Ralacionamento Many-to-Many

  • 8/3/2019 Curso de Hibernate 34066

    125/217

  • 8/3/2019 Curso de Hibernate 34066

    126/217

    @JoinTable

  • 8/3/2019 Curso de Hibernate 34066

    127/217

    Contm o nome da tabela de relacionamento O atributojoinColumns mapeia a coluna

    associada entidade mapeada

    O tipo do atributo @JoinColumn Annotation dentro de annotation

    O atributo inverseJoinColumns mapeia a colunaassociada outra entidade

    O tipo do atributo tambm @JoinColumn

    Classe Category

    @Entitypublic class Category {

  • 8/3/2019 Curso de Hibernate 34066

    128/217

    publicclass Category {

    @Id@GeneratedValue@Column(name = "CATEGORY_ID")

    private Long id;

    private String name;

    @ManyToMany@JoinTable(name = "CATEGORY_ITEM", joinColumns = @JoinColumn(name =

    "CATEGORY_ID"), inverseJoinColumns = @JoinColumn(name = "ITEM_ID"))private Setitems = new HashSet();

    }

    Classe Item

    @Entity

  • 8/3/2019 Curso de Hibernate 34066

    129/217

    @Entitypublicclass Item {

    @Id@GeneratedValue@Column(name = "ITEM_ID")

    private Long id;

    private String name;

    @ManyToMany(mappedBy = "items")private Setcategories = new

    HashSet();}

    Polimorfismo e LazyLoading

    U ili d li fi id d

  • 8/3/2019 Curso de Hibernate 34066

    130/217

    Utilizando-se polimorfismo, as entidades soreferenciadas atravs de suas super classes

    No se deve fazer o cast da referncia paraalguma das subclasses, mesmo que se saiba o tipodo objeto

    Para associaes carregadas por LazyLoading, utilizado um objeto proxy

    O objeto proxy no pode ser atribudo a umasubclasse da classe referenciada

  • 8/3/2019 Curso de Hibernate 34066

    131/217

    Entidade User

    @Entit

  • 8/3/2019 Curso de Hibernate 34066

    132/217

    @Entity@Table(name = "USERS")

    publicclass User {

    @Id@GeneratedValueprivate Long id;

    @OneToOne(fetch = FetchType.LAZY)@JoinColumn(name = "DEFAULT_BILLING_ID")

    private BillingDetails defaultBilling; }

    Polimorfismo e LazyLoading

    User user = (User) session.get(User.class, userId);Billi D t il billi D t il tD f ltBilli ()

  • 8/3/2019 Curso de Hibernate 34066

    133/217

    User user = (User) session.get(User.class, userId);BillingDetails bd = user.getDefaultBilling();

    CreditCard cc = (CreditCard) session.load(CreditCard.class, bd.getId());System.out.println(cc.getNumber());

    User user (User) session.get(User.class, userId);BillingDetails billingDetails = user.getDefaultBilling();

    //imprime falseSystem.out.println(billingDetails instanceof CreditCard);

    //ClassCastException

    CreditCard creditCard = (CreditCard) billingDetails;

    Ciclo de Vida dos Objetos

    E i l d id tid d d i

  • 8/3/2019 Curso de Hibernate 34066

    134/217

    Em seu ciclo de vida, uma entidade pode assumirdiversos estados relativos a sua persistncia

    Transiente

    Persistente

    Desconectada

    Removida

    Entidades devem se comportar de maneira

    apropriada mesmo que ainda no estejampersistentes

    Ciclo de Vida dos Objetos

    O ciclo de ida de ma entidade pode ser afetado

  • 8/3/2019 Curso de Hibernate 34066

    135/217

    O ciclo de vida de uma entidade pode ser afetadoatravs de chamadas s interfaces do Hibernate

    Operaes de alteraes e consultas na base de dados

    Operaes para delimitar a existncia de umatransao e de um Sesssion

    Para o correta implementao, a aplicao devese preocupar com o estado e o ciclo de vida doobjeto

    Ciclo de Vida dos Objetos: Conceitos Unidade de trabalho

    Conjunto de operaes geralmente atmicas

  • 8/3/2019 Curso de Hibernate 34066

    136/217

    Conjunto de operaes, geralmente atmicas

    Contexto de persistncia

    Cache de todas alteraes feitas em entidades em uma

    nica unidade de trabalho

    Estado Transiente

    o estado que um objeto assume quando criado

  • 8/3/2019 Curso de Hibernate 34066

    137/217

    o estado que um objeto assume quando criadoatravs do operador new

    No est associado a nenhum registro da base dedados

    Os dados so perdidos quando o objeto no mais referenciado e torna-se disponvel para oColetor de Lixo

    No so gerenciados pelo Hibernate No possuem comportamento transacional

    Estado Persistente

    uma entidade com um identificador na base de

  • 8/3/2019 Curso de Hibernate 34066

    138/217

    uma entidade com um identificador na base dedados

    Possui uma chave primria

    So objetos gerenciados pelo Hibernate

    Podem ser objetos criados pela aplicao

    Tornam-se persistentes atravs de chamadas aoHibernate

    Tornam-se persistentes se passarem a serreferenciados por outros objetos persistentes Depende do tipo de Cascade

    Persistente

    Podem ser objetos retornados da base de dados

  • 8/3/2019 Curso de Hibernate 34066

    139/217

    Podem ser objetos retornados da base de dados Atravs de uma consulta

    Atravs de uma associao entre um objeto persistente

    Podem ser objetos atualizados na base de dados So sempre associados a um Contexto de

    Persistncia

    So guardados em um cache

    Hibernate identifica qualquer alterao realizado noobjeto

    Removido

    Um objeto pode ser removido de duas maneiras

  • 8/3/2019 Curso de Hibernate 34066

    140/217

    Um objeto pode ser removido de duas maneiras Uma chamada explicita ao Hibernate

    Atravs de uma operao com Cascade

    Um objeto neste estado removido ao final daUnidade de Trabalho

    gerenciado pelo Contexto de Persistncia at que aUnidade de Trabalho termine

  • 8/3/2019 Curso de Hibernate 34066

    141/217

    Contexto de Persistncia

    Mantm um cache de instncias gerenciadas

  • 8/3/2019 Curso de Hibernate 34066

    142/217

    Mantm um cache de instncias gerenciadas Entidades no estado Persistente e Removido

    Conceito abstrato

    No representado por um nico objeto Cada objeto Session possui um Contexto de

    Persistncia

    Permite Dirty Checking automtico

    Delimita um escopo para a identidade das Entidades

    No possui instncias duplicadas

    Dirty Checking Automtico possvel atravs do Contexto de Persistncia

    O dados de uma entidade so sincronizados com

  • 8/3/2019 Curso de Hibernate 34066

    143/217

    O dados de uma entidade so sincronizados coma base de dados

    No final da unidade de trabalho

    Em outros momentos: antes de uma consulta Somente os objetos alterados so atualizados na

    base de dados

    Atualizao retardada o mximo possvel e feita de forma automtica

    Tempo de Lock do banco de dados reduzido

    Cache de Primeiro Nvel

    Armazenado no Contexto de Persistncia

  • 8/3/2019 Curso de Hibernate 34066

    144/217

    Armazenado no Contexto de Persistncia Mantm todas as instncias de uma Unidade de

    Trabalho

    Prov ganho de performance para a aplicao Torna possvelRepeatableRead

    Ao buscar mais de uma vez uma mesma entidade, osdados retornados so os mesmos

    O escopo restrito thread de execuo

    Cache de Primeiro Nvel

    Um nico objeto representa um determinadoregistro na base de dados

  • 8/3/2019 Curso de Hibernate 34066

    145/217

    j pregistro na base de dados

    Evita alteraes conflitantes

    Contexto Persistncia: Escopo

    Algumas funcionalidades da aplicao necessitamde diversas requisies para serem completadas

  • 8/3/2019 Curso de Hibernate 34066

    146/217

    Algumas funcionalidades da aplicao necessitamde diversas requisies para serem completadas

    O escopo do Contexto de Persistncia pode, ouno, ser o mesmo da funcionalidade

    Duas estratgias so as mais utilizadas paradelimitar o escopo do Contexto de Persistncia

    Um objeto Session por requisio

    Unidade de Trabalho de longa durao

    Uma Session por Requisio

    Quando o servidor recebe alguma requisio querequer acesso a base de dados uma nova Unidade

  • 8/3/2019 Curso de Hibernate 34066

    147/217

    Quando o servidor recebe alguma requisio querequer acesso a base de dados uma nova Unidadede Trabalho iniciada

    A Unidade de Trabalho encerrada quando a

    requisio processada e a resposta est prontapara ser enviada ao usurio

    As entidades so mantidas em estado

    Desconectado entre uma requisio e outra

    Uma Session por Requisio

    Entidades mantidas entre duas requisiesnecessitam ser reconectadas para acessar servios

  • 8/3/2019 Curso de Hibernate 34066

    148/217

    q necessitam ser reconectadas para acessar serviosde persistncia novamente

    Qualquer alterao feita em entidades

    desconectadas deve ser sincronizadamanualmente

    Operaes de atualizao e/ou merge

    Objetos Desconectados

  • 8/3/2019 Curso de Hibernate 34066

    149/217

    Unidade de Trabalho de LongaDurao

    Objeto Session mantido aberto durante vriasrequisies

  • 8/3/2019 Curso de Hibernate 34066

    150/217

    jrequisies

    O Contexto de Persistncia se propaga durante toda aconversao

    Conexes com a base de dados no so mantidasabertas

    A cada nova requisio o contexto reconectado basede dados

    As entidades so mantidas no estado Persistente

    No requer merge ou atualizao manual

    Unidade de Trabalho de LongaDurao

    No final da conversao, o Contexto sincronizado com a base de dados e encerrado

  • 8/3/2019 Curso de Hibernate 34066

    151/217

    ,sincronizado com a base de dados e encerrado

    A atomicidade das alteraes relativa funcionalidade como um todo

    Contexto expandido

  • 8/3/2019 Curso de Hibernate 34066

    152/217

    Escopo limitado ao Contexto dePersistncia

    Session session = HibernateUtil.getSessionFactory().openSession();Transaction transaction = session.beginTransaction();

  • 8/3/2019 Curso de Hibernate 34066

    153/217

    Long id = (Long) session.save(new Message("Hibernate"));

    Message messageB = (Message) session.get(Message.class, id);Message messageC = (Message) session.get(Message.class, id);

    System.out.println(messageB.equals(messageC));

    transaction.commit();session.close();

    Session session2 = HibernateUtil.getSessionFactory().openSession();Transaction transaction2 = session2.beginTransaction();

    Message messageD = (Message) session2.get(Message.class, id);System.out.println(messageC.equals(messageD));

    Identidade de objetos Desconectados

    Sempre que se for trabalhar com objetosdesconectados, deve-se sobrescrever o mtodo

  • 8/3/2019 Curso de Hibernate 34066

    154/217

    ,equals()

    Para objetos desconectados a garantia de uma nica

    instncia por registro perdida Implementao default no garante o comportamento

    desejado

    Mesmo que dois objetos possuam todas as

    propriedades iguais, o mtodo pode retornar false

    equals() Deve retornar verdadeiro se duas instncias

    corresponderem ao mesmo registroQ i i d d d d ?

  • 8/3/2019 Curso de Hibernate 34066

    155/217

    Quais propriedades devem ser comparadas?

    Somente a chave primria

    Problema: entidades transientes no possuem valorespara a chave primria

    Todas as propriedades

    Problema: entidades referentes ao mesmo registro noso consideradas iguais se alguma propriedade mudar

    Melhor abordagem: comparar a chave de negcio

    Chave de negcio

    Uma propriedade, ou um conjunto delas, que nico para cada registro

  • 8/3/2019 Curso de Hibernate 34066

    156/217

    p g

    Chave candidata

    No precisa ser imutvel, basta que mude com

    pouca freqncia

    Implementaopublicboolean equals(Object other) {

    if (!(other instanceof User)){

    returnfalse;}

  • 8/3/2019 Curso de Hibernate 34066

    157/217

    User that = (User) other;returnthis.name.equals(that.getName());

    }

    publicint hashCode() {returnthis.name.hashCode();

    }

    Interagindo com o Hibernate

    O Hibernate prov diversos servios Operaes CRUD

  • 8/3/2019 Curso de Hibernate 34066

    158/217

    Operaes CRUD Criar

    Recuperar

    Atualizar Deletar

    Realizao de consultas

    Controle de transao

    Gerenciamento do Contexto de Persistncia

    Interagindo com o Hibernate

    Os servios so disponibilizados atravs dediversas Interfaces

  • 8/3/2019 Curso de Hibernate 34066

    159/217

    Session

    Transaction

    Query Criteria

    Armazenando e Recuperando Objetos

    Para armazenar ou recuperar objetos, necessrioiniciar uma Unidade de Trabalho

  • 8/3/2019 Curso de Hibernate 34066

    160/217

    Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();

    Um Contexto de Persistncia criado

    Ir gerenciar todas as entidades do Session

    Uma transao tambm deve ser iniciada

    mesmo para operaes de leitura

    Armazenando um Objeto

    // Quando instanciado, o item est no estado TransienteItem item = new Item();item.setName("Item 1");

  • 8/3/2019 Curso de Hibernate 34066

    161/217

    // um novo Session abertoSession session = HibernateUtil.getSessionFactory().openSession();Transaction transaction = session.beginTransaction();

    // O item passa para o estado Persistente e fica associado//ao Session e ao Contexto de Persistnciasession.save(item);

    //As mundanas so sincronizadas com a base de dadostransaction.commit();

    //O Session fechado e o Contexto de Persistncia encerrado.//O item passa para o estado Desconectadosession.close();

    Armazenando um Objeto

  • 8/3/2019 Curso de Hibernate 34066

    162/217

    Recuperando uma Entidade

    Session session = HibernateUtil.getSessionFactory().openSession();Transaction tx = session.beginTransaction();

  • 8/3/2019 Curso de Hibernate 34066

    163/217

    //Item recuperado no estado TransienteItem item = (Item) session.load(Item.class, new Long(1234));// Item item = (Item) session.get(Item.class, new Long(1234));

    tx.commit();

    //Item passa para o estado Desconectadosession.close();

    Recuperando uma Entidade

  • 8/3/2019 Curso de Hibernate 34066

    164/217

    Recuperando uma Entidade

    Mtodo get() Se o objeto procurado no for encontrado, retorna null

  • 8/3/2019 Curso de Hibernate 34066

    165/217

    Mtodo load()

    Se o objeto procurado no for encontrado, lana aexceo ObjectNotFoundException

    A existncia do objeto s verificada quando algumapropriedade acessada

    Modificando um Objeto Persistente

    Todo objeto retornado pelos mtodos load() ouget() ou atravs de uma consulta, assume o estadoPersistente

  • 8/3/2019 Curso de Hibernate 34066

    166/217

    Persistente

    Os objetos podem ser modificados e as alteraes

    so sincronizadas com a base de dados

    Modificando um Objeto Persistente

    Long id = armazenarItem();

    Session session = HibernateUtil.getSessionFactory().openSession();Transaction tx = session beginTransaction();

  • 8/3/2019 Curso de Hibernate 34066

    167/217

    Transaction tx = session.beginTransaction();

    Item item = (Item) session.get(Item.class, id);item.setName("Playstation");

    //Dados sincronizados com a base de dados. Dirty Cheking automticotx.commit();session.close();

    Modificando um Objeto Persistente

  • 8/3/2019 Curso de Hibernate 34066

    168/217

    De Persistente para TransienteLong id = armazenarItem();

    Session session = HibernateUtil.getSessionFactory().openSession();Transaction tx = session.beginTransaction();

  • 8/3/2019 Curso de Hibernate 34066

    169/217

    //Item no estado PersistenteItem item = (Item) session.load(Item.class, id);

    //Item no estado Removido

    session.delete(item);

    tx.commit();

    //Item no estado Transientesession.close();

    De Persistente para Transiente

  • 8/3/2019 Curso de Hibernate 34066

    170/217

    Trabalhando com ObjetosDesconectados

    Modificaes realizadas em objetosDesconectados no so sincronizadas na base dedados

  • 8/3/2019 Curso de Hibernate 34066

    171/217

    dados

    A atualizao da base de dados pode ser feita de

    duas formas Reconectando o objetoreattach

    Realizando o merge do objeto

    Reconectando um Objeto

    Um objeto reconectado atravs do mtodoupdate() da interface Session

  • 8/3/2019 Curso de Hibernate 34066

    172/217

    O objeto passa a ser gerenciado pelo Session eassume o estado Persistente

    Deve-se ter certeza de que o Session ainda nopossui um objeto gerenciado com o mesmo Id

    Somente uma instncia do Contexto de Persistncia

    pode estar associada a um determinado registro

    Reconectando um Objeto

    Item item = recuperarItem(armazenarItem());

  • 8/3/2019 Curso de Hibernate 34066

    173/217

    item.setName("Novo nome");

    Session session = HibernateUtil.getSessionFactory().openSession();

    Transaction transaction = session.beginTransaction();

    session.update(item);

    item.setPrice(Integer.valueOf(114));

    transaction.commit();session.close();

    Reconectando um Objeto

  • 8/3/2019 Curso de Hibernate 34066

    174/217

    NonUniqueObjectException

    Long id = armazenarItem();

    Item item = recuperarItem(id);

    item.setName("Novo nome");

  • 8/3/2019 Curso de Hibernate 34066

    175/217

    Session session = HibernateUtil.getSessionFactory().openSession();Transaction transaction = session.beginTransaction();

    Item item2 = (Item) session.get(Item.class, id);session.update(item);

    item.setPrice(Integer.valueOf(114));

    transaction.commit();session.close();

  • 8/3/2019 Curso de Hibernate 34066

    176/217

    Mtodo merge()

    O objeto desconectado no passa a ser associadoao Session

    Continua desconectado

  • 8/3/2019 Curso de Hibernate 34066

    177/217

    Continua desconectado

    O objeto persistente retornado

    Mtodo merge()

    Long id = armazenarItem();Item item = recuperarItem(id);

    it tN ("N !!!")

  • 8/3/2019 Curso de Hibernate 34066

    178/217

    item.setName("Novo nome!!!");

    Session session = HibernateUtil.getSessionFactory().openSession();Transaction transaction = session.beginTransaction();

    Item item2 = (Item) session.get(Item.class, id);Item item3 = (Item) session.merge(item);

    transaction.commit();session.close();

    Mtodo merge()

  • 8/3/2019 Curso de Hibernate 34066

    179/217

    Persistncia Transitiva

    Em aplicaes no triviais, diversas Entidadespodem estar associadas

    A aplicao deve poder manipular as associaes

  • 8/3/2019 Curso de Hibernate 34066

    180/217

    A aplicao deve poder manipular as associaes

    Uma rede de objetos pode consistir de objetos em

    diferentes estados Persistentes

    Desconectados

    Transientes

    Persistncia Transitiva A Persistncia Transitiva permite persistir objetos

    Desconectados e Transientes automaticamente Um objeto Transiente associado a um Persistente,

    t i t t t ti t

  • 8/3/2019 Curso de Hibernate 34066

    181/217

    torna-se persistente automaticamente

    No h necessidade de chamar o mtodo save()

    Diversas operaes poder ser cascateadas

    Salvar

    Deletar

    Reconectar (update)

    Merge

    Cascade

    Por default, em nenhuma operao feito o cascade

    O Hibernate permite a configurao do tipo decomportamento desejado para cada associao

  • 8/3/2019 Curso de Hibernate 34066

    182/217

    comportamento desejado para cada associao

    Todos os tipos de associaes podem ser

    configuradas one-to-one

    one-many

    many-to-many many-to-one

  • 8/3/2019 Curso de Hibernate 34066

    183/217

    org.hibernate.annotations.CascadeType

    DELETE_ORPHAN

    Deleta um objeto se ele for excludo da coleo

    Aplicvel somente para relacionamentos One-to-

  • 8/3/2019 Curso de Hibernate 34066

    184/217

    Aplicvel somente para relacionamentos One toMany

    Cascade aplicvel somente pararelacionamentos entre entidades

    Exerccio

  • 8/3/2019 Curso de Hibernate 34066

    185/217

  • 8/3/2019 Curso de Hibernate 34066

    186/217

    Consultas

    Podem ser feitas de trs maneiras

    Hibernate Query Language (HQL)

    Criteria API e Query by Example

  • 8/3/2019 Curso de Hibernate 34066

    187/217

    Criteria API e Query by Example

    Utilizando SQL

    Consultas: Exemplos

    // Atravs de HQLsession.createQuery("from Category c where c.name like 'Laptop%'");

    // Utilizando-se Criteriasession.createCriteria(Category.class).add(

  • 8/3/2019 Curso de Hibernate 34066

    188/217

    ( g y ) (Restrictions.like("name", "Laptop%"));

    // Atravs de SQLsession.createSQLQuery(

    "select {c.*} from CATEGORY {c} where NAME like 'Laptop%'").addEntity("c", Category.class);

    Consultas

    Envolve alguns passos

    Criar a consulta com as restries necessrias

    Adicionar parmetros consulta

  • 8/3/2019 Curso de Hibernate 34066

    189/217

    p

    Executar a consulta e recuperar o resultado A forma de execuo da consulta e obteno dos dados pode ser

    configurada

    Criando a Consulta

    Objetos Query e Criteria so obtidos atravs doSession

    org.hibernate.Query

  • 8/3/2019 Curso de Hibernate 34066

    190/217

    Query query = session.createQuery("from User");

    Criteria criteria = session.createCriteria(User.class);

    org.hibernate.Criteria

    Adicionando Parmetros Consulta

    Parmetros no devem ser adicionados na prpriaString da consulta "from Item i where i.description like '" + search + "'"

  • 8/3/2019 Curso de Hibernate 34066

    191/217

    Evita-se ataque do tipo SQL Injection

    foo' and callSomeStoredProcedure() and 'bar' = 'bar Parmetros podem ser adicionados atravs de sua

    posio ou de seu nome

    Adicionando Parmetros pelo Nome

    Nome do parmetro precedido de :

    O valores so adicionados atravs de mtodossets

  • 8/3/2019 Curso de Hibernate 34066

    192/217

    String queryString = "from Item item where item.description like:search";

    Query q = session.createQuery(queryString).setString("search",searchString);

    String queryString = "from Item item"+ " where item.description like :search"

    + " and item.date > :minDate";Query q = session.createQuery(queryString).setString("search",searchString).setDate("minDate", mDate);

    Adicionando Parmetros pela Posio

    A consulta contm ? para indicar a existncia

    de alguma parmetro Os valores tambm so adicionado atravs de

  • 8/3/2019 Curso de Hibernate 34066

    193/217

    String queryString = "from Item item"+ " where item.description like ?" + " and item.date > ?";

    Query q = session.createQuery(queryString).setString(0,searchString).setDate(1, minDate);

    mtodos sets

  • 8/3/2019 Curso de Hibernate 34066

    194/217

    Executando a Consulta

    Query query = session.createQuery("from User");

    List list = query.list();

    for (User user : list) {System.out.println(user.getName());

    }

  • 8/3/2019 Curso de Hibernate 34066

    195/217

    }

    Query query2 = session.createQuery(

    "from User user where user.name =:name").setString("name","SUNSP");

    User user = (User) query2.uniqueResult();

    System.out.println(user.getName());

    Consultas Bsicas A consulta mais simples tem somente a clusula

    FROM from Item

    Para se referenciar as propriedades de uma entidade,

  • 8/3/2019 Curso de Hibernate 34066

    196/217

    Para se referenciar as propriedades de uma entidade,um ALIAS deve ser criado

    from Item as item

    from Item item Palavra chave as opcional

    A consulta no case-sensitive FROM Item AS item tambm pode ser utilizada

    Consultas Polimrficas

    Consultas podem ser escritas utilizandopolimorfismo

    from BillingDetails

  • 8/3/2019 Curso de Hibernate 34066

    197/217

    Retorna todas as entidades que herdam de

    BillingDetails CreditCard

    BankAccount

    A superclasse no precisa estar mapeada

    from java.lang.Object

    from java.io.Serializable

    Restries

    Geralmente no se quer trazer todo o contedo databela

    Restries devem ser adicionadas para restringir osbj t t d

  • 8/3/2019 Curso de Hibernate 34066

    198/217

    objetos retornados

    HQL tambm utiliza-se a clusula WHERE As restries so feitas sobre propriedades da

    entidade

    Restries

    Literais e condies podem ser includos

    Utiliza-se aspas simples para literais do tipo String

    from User u where u.email = '[email protected]'

    mailto:'[email protected]:'[email protected]
  • 8/3/2019 Curso de Hibernate 34066

    199/217

    from Item i where i.isActive = true

    Comparaes podem ser realizadas

    from Bid bid where bid.amount between 1 and 10

    from Bid bid where bid.amount > 100

    from User u where u.email in ('foo@bar','bar@foo')

    Operador LIKE pode ser utilizado

    % representa qualquer seqncia de caracteres

    _ (Under_Score) representa qualquer caractere

    Comparaes

  • 8/3/2019 Curso de Hibernate 34066

    200/217

    from User u where u.firstname like 'G%'

    Negao pode ser utilizada from User u where u.firstname not like '%Foo B%'

    Operadores lgicos e parnteses

    from User user where user.firstname like 'G%' anduser.lastname like 'K%'

    Comparaes

    Operadores lgicos e parnteses

    from User u where (u.firstname like 'G%' andu.lastname like 'K%' ) or u.email in('[email protected]', '[email protected]' )

  • 8/3/2019 Curso de Hibernate 34066

    201/217

    ( @ g , @ g )

    Colees "from Item i where i.bids is not empty"

    Comparaes

    Funes podem ser chamadas a partir do HQL

    HQL permite a chamada de funes SQL na clusulaWHERE

    Funes podem ser definidas pelo usurio

  • 8/3/2019 Curso de Hibernate 34066

    202/217

    Funes podem ser definidas pelo usurio

    Depende do suporte do banco de dados Funes UPPER() e LOWER()

    "from User u where lower(u.email) = '[email protected]'"

    Funo SIZE() from Item i where size(i.bids) > 3

    E muitas outras...

    mailto:'[email protected]:'[email protected]
  • 8/3/2019 Curso de Hibernate 34066

    203/217

    Comparaes

    Outras funes

    CURRENT_DATE(), CURRENT_TIME(),CURRENT_TIMESTAMP() Valores retornados so referentes ao SGBD

  • 8/3/2019 Curso de Hibernate 34066

    204/217

    Valores retornados so referentes ao SGBD

    SECOND(d), MINUTE(d), HOUR(d), DAY(d),MONTH(d), YEAR(d) Extraem os valores de um argumento temporal

    Ordenando o Resultado

    A Clusula ORDER BY utilizada para ordenar o

    resultado "from User u order by u.name"

    Ordem ascendente ou descendente

  • 8/3/2019 Curso de Hibernate 34066

    205/217

    Ordem ascendente ou descendente

    Utiliza-se asc ou desc from User u order by u.username desc

    Ordenando por mais de uma propriedade

    from User u order by u.lastname asc, u.firstnameasc

    Junes

    A habilidade de realizar junes uma das

    principais foras do modelo relacional Permite selecionar diferentes objetos associados e

    colees em uma nica consulta

  • 8/3/2019 Curso de Hibernate 34066

    206/217

    colees em uma nica consulta

    Inner Join

    Contm somente os registros que esto

    relacionados com o outro lado da juno Contm somente osItens que possuemBids

  • 8/3/2019 Curso de Hibernate 34066

    207/217

    (left) Outer Join

    Retorna todos os Itens

    Dados de Bid so preenchidos com NULL se nohouver uma correspondncia

  • 8/3/2019 Curso de Hibernate 34066

    208/217

    Juno com HQL

    Coluna de juno no precisar ser informada na

    consulta Informao extrada do mapeamento

    necessrio ser informado somente o nome da

  • 8/3/2019 Curso de Hibernate 34066

    209/217

    associao

    Nome do atributo que referencia a classe ou coleode classes

    Joins podem ser executados de duas maneiras

    Join implcitos na Associao Join especificado na clusula FROM

    Join Implcito na Associao

    O Join realizado atravs da associao entre duas

    entidades Exemplo:

    from Bid bid where bid item description like '%Foo%'

  • 8/3/2019 Curso de Hibernate 34066

    210/217

    from Bid bid where bid.item.description like %Foo%

    Bid associado a Item atravs do atributo item Hibernate sabe que a associao est mapeada a partir da

    chave estrangeira ITEM_ID da tabela BID

    Joins implcitos so sempre realizados atravs deassociaes many-to-one ou one-to-one

    Join Implcito na Associao

    Mltiplos joins so possveis

    from Bid bid where bid.item.category.name like 'Laptop%'

  • 8/3/2019 Curso de Hibernate 34066

    211/217

    Join especificado na Clusula FROM

    Joins podem ser especificados explicitamente na

    clusula FROM Exemplo

    "select i from Item i join i bids b where b amount >

  • 8/3/2019 Curso de Hibernate 34066

    212/217

    select i from Item i join i.bids b where b.amount >

    10" Aliases devem ser especificados na clusula

    FROM e utilizados na clusula WHERE

    Clusula SELECT utilizada para que somenteItens sejam retornados

    Join especificado na Clusula FROM

    Na consulta, um Item pode ser retornado mais de

    uma vez Uma para cada Bid associado

    Somente uma instncia utilizada

  • 8/3/2019 Curso de Hibernate 34066

    213/217

    A consulta possui o mesmo formato paraassociaes many-to-one e one-to-one

    Outer Joins

    Para a utilizao de Outer Joins utiliza-se a

    clusula LEFT JOIN LEFT OUTER JOIN e RIGHT OUTER JOIN

    tambm podem ser utilizados

  • 8/3/2019 Curso de Hibernate 34066

    214/217

    A clusula WITH utilizada para adicionarrestries

    "select i from Item i left join i.bids b withb.amount >= 9"

    Itens que no possuem Bids tambm so retornados

    Comparando Identificadores

    Na Orientao a Objetos no so os identificadores,

    mas as referncias ao objetos que so comparadas Comparaes podem ser feitas atravs dos atributos

    das entidades

  • 8/3/2019 Curso de Hibernate 34066

    215/217

    "select i from Item i join i.bids b where i.seller =b.bidder"

    i.seller e b.bidder representam referncias para aentidade User

    Retorna os Itens em que o prprio vendedor deu umlance

    Comparando Identificadores

    Entidades tambm podem ser adicionadas como

    parmetros de uma consulta

    Query query = session.createQuery("from Item i where

  • 8/3/2019 Curso de Hibernate 34066

    216/217

    i.seller = :seller");

    query.setEntity("seller", user);

    FIM...

    Referncias

    Livro Java Persistence with Hibernate Edio revisada do livro Hibernate in Action

    Autores

  • 8/3/2019 Curso de Hibernate 34066

    217/217

    Christian Bauer Gavin King

    http://www.hibernate.org/ Documentao e Javadoc

    Frum de discues e dvidas

    JSR 220: Enterprise JavaBeans Version 3.0 Para as Annotations do pacote javax.persistence

    http://www.hibernate.org/http://www.hibernate.org/http://www.hibernate.org/