70
Hibernate Prof. Anselmo Cardoso Paiva Prof. Geraldo Braz Junior Baseado nas notas de aula de João Dalyson e Raphaela Galhardo Fernandes Mapeamento Objeto-Relacional

Hibernate - DEINF/UFMAgeraldo/poo/11.Hibernate1.pdf · JPA (EJB 3.0) 7. Hibernate ... Open Source; Suporte: Coleções Relacionamento entre objetos Herança, polimorfismo e composições

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

Mapeamento Objeto Relacional

Metadados descrevem o mapeamento entre os objetos e o banco de dados

3

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

Exemplo MOR

5

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

10

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

Ciclo de Vida

17

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

Chave primária: mecanismos

22

Hibernate com Anotações

23

O que são?

24

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

Mapeamento com Anotações Pacotes:

javax.persistence.*

org.hibernate.annotations.*

26

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

Dialetos

32

Manipulando objetos

33

Manipulando Objetos

34

Código gerado1. Hibernate: insert into exemplo.aluno2. (matricula, nome, cpf)3. values (?, ?, ?)

35

Metodos Session

36

SaveOrUpdate

37

Delete

38

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

Mapeamento Cliente

40

Mapeamento Cliente

41

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

Mapeamento de Associações

One-to-One, One-to-Many, Many-to-One, Many-to-Many

44

Tipos Um-para-um;

Muitos-para-um;

Um-para-muitos;

Muitos-para-muitos

45

OneToMany Exemplo:

Uma universidade possui N centros

@OneToMany;

46

One-To-Many

47

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

Exemplo @Cascade(CascadeType.ALL)

50 Insere todos os centros!

ManyToOne Exemplo:

Uma universidade possui N centros

@OneToMany;

51

Mapeando Centro

52

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

ManyToMany Nova tabela entre o relacionamento;

55

Mapeamento Departamento

56

Mapeamento Departamento

57

Mapeamento Curso

58

Associações - ManyToMany

@ManyToMany

fetch: FetchType.EAGER;

FetchType.LAZY.

cascade.

59

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

Exemplo

61

Associações - ManyToMany Nova tabela entre o relacionamento com

outros atributos;

62

Associações – ManyToMany Classe extra para a chave composta:

63

Associações - ManyToMany

64

Exemplo

65

OneToOne Formas de Mapeamento:

@OneToOne.

66

Associações – OneToOne Tabela endereco vai ter referência para

universidade

67

Associações – OneToOne

68

Exemplo

69

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