Post on 07-Apr-2018
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 = 'foo@hibernate.org'
mailto:'foo@hibernate.orgmailto:'foo@hibernate.org8/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('foo@hibernate.org', 'bar@hibernate.org' )
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) = 'foo@hibernate.org'"
Funo SIZE() from Item i where size(i.bids) > 3
E muitas outras...
mailto:'foo@hibernate.orgmailto:'foo@hibernate.org8/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/