Upload
truongtruc
View
275
Download
1
Embed Size (px)
Citation preview
Hibernate
Prof. Anselmo Cardoso Paiva
Prof. Geraldo Braz JuniorBaseado nas notas de aula de João Dalyson
e Raphaela Galhardo Fernandes
Mapeamento Objeto-Relacional
Objetivos Aprender MOR usando Hibernate
Configurar o Hibernate (XML, Anotações)
Aprender a preparar consultas e comandos de manipulação de objetos com o Hibernate + BD;
2
2
MOR: Mapeando atributos Mapeamento simples;
Atributos de uma classe correspondem a colunas de uma tabela;
Deve-se considerar: Tipos de dados;
Comprimento máximo dos dados;
Precisão.
Não é obrigado um atributo de uma classe se referir a uma coluna da tabela.
4
MOR: Mapeamento de relacionamentos Tipos:
Um-para-um;
Um-para-muitos;
Muitos-para-um;
Muitos-para-muitos.
6
MOR: Opções JDBC:
Ferramentas Existentes: Hibernate;
JDO;
Ibatis;
Castor;
Torque;
EJB/CMP;
JPA (EJB 3.0)
7
Hibernate Framework de mapeamento objeto
relacional para aplicações Java;
Open Source;
Suporte: Coleções
Relacionamento entre objetos
Herança, polimorfismo e composições
Linguagem de consulta própria HQL – Hibernate Query Language
8
Benefícios do MOR e do Hibernate Produtividade Permite que você se concentre no problema
de negócio; Manutenção Menos linhas de código (sistema mais
compreensível) Desempenho Hibernate permite otimizações
Independência de fornecedor Abstrai o aplicativo do sistema de banco de
dados Portabilidade
9
Hibernate - Arquitetura Session:
Possibilita a comunicação entre a aplicação e a persistência;
Objetos leves (barata de criar e destruir);
De vida curta;
A partir dele é possível: Realizar operações CRUD:
(create, retrieve, update e delete)
11
Hibernate - Arquitetura SessionFactory:
Possui informações de um banco de dados;
Fábrica de objetos do tipo Session;
Objeto Pesado;
Uma única instância por aplicação; Múltiplos bancos de dados (Uma SessionFactory
para cada)
Mantém o MOR em memória.
12
Hibernate - Arquitetura Configuration:
Usado para configurar informações para inicialização do Hibernate; Local documentos de mapeamentos
Propriedades específicas do hibernate
Usado para a obtenção de um objeto SessionFactory:
13
Hibernate - Arquitetura Transaction (opcional):
Objeto de vida curta;
Usados para especificar unidades atômicas de trabalho;
Abstrai o aplicativo de lidar diretamente com transações JDBC, JTA ou CORBA.
14
Hibernate - Arquitetura Interfaces Criteria e Query
Query: Executar consultas no banco de dados
Controlar como a consulta é executada
Criteria: Bem similar a Query
Permite executar e criar consultas com criterios orientados para objetos
15
Classes Persistentes Implementam as entidades de domínio do
negócio;
Associadas a uma tabela no banco de dados;
Classes POJO’s (Plain Old Java Objects): Estrutura de JavaBeans Construtor padrão;
Métodos getters e setters;
Com atributo identificador independente da lógica de negócio.
16
Objetos Persistentes Possuem uma identidade de banco de
dados;
Estado do objeto continua existindo após a destruição do seu processo;
Pode ser recriado em um novo objeto.
18
Objetos Transientes Tempo de vida ligado ao tempo do processo
que o criou;
Não necessariamente possuem estado persistente;
Não podem ser reconstituídos automaticamente.
19
Objetos Detached Objetos em estado intermediário;
Já Foram associados a um contexto persistente;
Perderam o contexto
Fechamento ou finalização de sessão.
20
Chave Primária Uma chave candidata a ser primária é uma
coluna ou conjunto delas que identificam apenas uma linha;
Uma chave deve ser:
Única;
Sempre não nula;
Constante.
É importante que a chave primária não tenha significado de negócio.
21
Primeiro Exemplo de Persistência
CREATE TABLE `aluno` (
`id_aluno` INT(10) NOT NULLAUTO_INCREMENT,
`matricula` INT(10) NOT NULL,
`nome` VARCHAR(40) NOT NULL,
`cpf` BIGINT(20) NOT NULL,
PRIMARY KEY (`id_aluno`) )
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
AUTO_INCREMENT= 0
25
Exemplo de mapeamento1. import javax.persistence.*;
2. @Entity3. @Table(name="aluno", schema=“exemplo")
4. public class Aluno {5. @Id6. @GeneratedValue(strategy = GenerationType.IDENTITY)7. @Column(name="id_aluno")8. private int id;
9. private int matricula;10. private String nome;11. private long cpf;12. //Construtor padrão13. public Aluno(){}14. //Métodos getters e setters15. //...16. }
27
Anotações @Entity: informa que a classe mapeada é
persistente
@Table: informa nome da tabela correspondente.
name: nome da tabela;
schema: nome do esquema no banco de dados onde está a tabela.
Necessário apenas se nome da tabela é diferente do nome da classe e a tabela está em esquema diferente de public.
28
Anotações @Id: define chave primária.
@GeneratedValue: define mecanismo de geração da chave primária.
strategy = GenerationType.IDENTITY
@Column:
name: define nome da coluna que mapeia atributo.
29
Configuração Necessário criar um arquivo
hibernate.cfg.xml
Também necessário as bibliotecas: hibernate3.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar (alternativas)
(E pasta required)
Além do conector para mysql
30
hibernate.cfg.xml1. <?xml version="1.0" encoding="UTF-8"?>2. <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate
Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration><session-factory><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3309/exemplo</property>
<property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">root</property><property name="hibernate.connection.pool_size">10</property>
<mapping class="exemplo.Aluno"/></session-factory>
</hibernate-configuration
31
Segundo Exemplo: ClienteCREATE TABLE `cliente` (
`id_cliente` INT(10) NOT NULLAUTO_INCREMENT,
`cpf` BIGINT(20) NOT NULL DEFAULT '0',
`nome` VARCHAR(40) NOT NULLDEFAULT '0',
`endereco` VARCHAR(100) NULL DEFAULT'0',
`total_compras` DECIMAL(10,2) NULLDEFAULT '0.00',
`data_cadastro` TIMESTAMP NULLDEFAULT CURRENT_TIMESTAMP,
`data_nascimento` DATE NOT NULL, PRIMARY KEY (`id_cliente`), UNIQUEINDEX `u_cpf` (`cpf`)
)
39
Anotações @Transient: mapeia atributo não
persistente.
@Temporal: mapeamento de datas e horas:
TemporalType.DATE: usado para mapear datas;
TemporalType.TIME: usado para mapear hora;
TemporalType.TIMESTAMP: usado para mapear datas e hora.
42
Anotações @Column: definição de uma coluna:
name: nome da coluna;
unique: unicidade ou não;
nullable: coluna nula ou não;
length: tamanho da coluna;
precision: precisão;
insertable: atributo deve ser inserido ou não;
updatable: atributo deve ser atualizado ou não.
43
OneToMany @OneToMany:
mappedBy: atributo no relacionamento muitos-para-um;
fetch: indica quando o conteúdo será trazido do banco de dados;
cascade: indica ação em cascata do relacionamento: CascadeType.PERSIST;
CascadeType.REMOVE;
CascadeType.REFRESH;
CascadeType.MERGE;
CascadeType.ALL;
48
OneToMany @OneToMany:
fetch: (javax.persistence.FetchType)
FetchType.EAGER: sempre trazer;
FetchType.LAZY: trazer apenas quando necessário.
@OrderBy:
Ordena coleção “<atributo> ASC”
“<atributo> DESC”
Exemplo: @OrderBy("nome ASC")
49
Associações - ManyToOne @ManyToOne
fetch: FetchType.EAGER;
FetchType.LAZY.
cascade.
@JoinColumn: informa nome da coluna chave estrangeira:
name = nome da coluna;
insertable = atributo deve ser inserido ou não;
updatable = atributo deve ser atualizado ou não.
53
Associações - ManyToOne @Fetch: define como o atributo deve ser
recuperado do banco de dados:
FetchMode.JOIN: utiliza outer join;
FetchMode.SELECT: utiliza novo select;
FetchMode.SUBSELECT: utiliza uma consulta subselect. Não permitido para @ManyToOne.
54
Associações - ManyToMany @JoinTable: informa qual é a tabela
intermediária:
name: nome da tabela;
schema: esquema em que se encontra;
joinColumns: qual coluna o representa na tabela intermediária;
inverseJoinColumns: qual coluna representa a outra entidade do relacionamento.
60
Referências Raphaela Galhardo Fernandes, Gleydson de
A. Ferreira Lima:Hebernate com Anotações <http://wiki.futurepages.org/lib/exe/fetch.php?media=quickstart:hibernate_anotacoes.pdf>
Hibernate:
http://sourceforge.net/projects/hibernate/files/hibernate3/
http://www.hibernate.org/docs
70