Hibernate

42
1-1 Hibernate Glauber Magalhães Pires

description

programar ações no banco de dados

Transcript of Hibernate

1-1

Hibernate

Glauber Magalhães Pires

1-2

Hibernate

Roteiro• O que é? Para que Serve?

• O que fazer para usá-lo? Como funciona?

• Vantagens/Desvantagens

• Exemplo

• Componentes de uma aplicação com Hibernate

• Exemplos Básicos

• Criação de mapeamentos (HBM)

• Criteria

• HQL

• Outros Aspectos (Lazy Loading, Cache, etc.)

1-3

Hibernate

O que é? • Hibernate é uma solução para mapeamento objeto-realcional

(ORM) open-source e bastante popular em Java.

Para que Serve?• Serve para reduzir a impedância da programação orientada à

objetos utilizando bancos de dados relacionais.

• As tabelas do banco de dados são representadas através de classes e os registros de cada tabela são representados como instâncias das classes correspondentes.

• Permite que sejam feitas operações sobre os dados em HQL (Hibernate Query Language ) no lugar de SQL (Structured Query Language)

1-4

Hibernate

O que fazer para usá-lo?• Cria-se o Value Object que representará a tabela.

• Define-se o mapeamento objeto relacional em arquivos XML.

• Configura-se o hibernate para usar o objeto mapeado

Como funciona?• Utilizando os itens anteriores o Hibernate “simula” um banco de

dados orientado a objetos, aceitando operações OO (inserir/atualizar/recuperar objetos, consultar por campos de classes que são atributos da classe, inserir uma lista, inserir árvores, etc.)

1-5

Hibernate

Vantagens• Linguagem de consulta OO

• Cache

• Lazy Loading

• Suporte a vários BDs

• Independência entre o HQL e o BD utilizado

Desvantagens• Overhead

• Curva de aprendizado

• Sem suporte a Stored Procedures (em HQL)

1-6

Hibernate

VO

package aluno;

public class Aluno{ int matricula; String nome;

int idade;}

<class name="aluno.Aluno" table="tabela_aluno"> <id name="matricula" type="int"

column="matricula">

<generator class="native"> </generator> </id>

<property name="nome" type="java.lang.String" update="true" insert="true" column="nome"

length="100"not-null="true"

/> <property name="idade" type="int" update="true" insert="true" column="idade"

not-null="true" />

</class>

+

Mapeamento

1-7

Hibernate

Componentes de uma aplicação com Hibernate• Hibernate Properties File: arquivo (xml ou properties) contendo as

propriedades de conexão ao banco

• Hibernate Query Language (HQL)

• Values Objects/Transfer Object/POJO

• Hibernate Mapping File (hbm): arquivo xml que relaciona as propriedades do objeto aos campos da tabela mapeada

1-8

Hibernate

Hibernate Properties File (hibernate.properties)

## Database connection settingsconnection.driver_class com.mysql.jdbc.Driverhibernate.connection.url jdbc:mysql://localhost/minicursoconnection.username rootconnection.password

## JDBC connection pool (use the built-in)connection.pool_size 1

## SQL dialecthibernate.dialect org.hibernate.dialect.MySQLDialect

## Echo all executed SQL to stdoutshow_sql true

1-9

Hibernate

Hibernate cfg.xml (hibernate.cfg.xml)

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

<mapping resource="aluno/Aluno.hbm.xml"/>

</session-factory>

</hibernate-configuration>

1-10

Hibernate

Exemplos Básicos• Inserir

• Atualizar

• Recuperar

• Apagar

1-11

Hibernate

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

Aluno aluno = new Aluno();aluno.nome=novoNome;

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

Inserir• session.save(OBJETO) para inserir

• session.saveOrUpdate(OBJETO) para inserir caso o objeto seja novo ou atualizar caso o objeto já tenha chave primária definida.

1-12

Hibernate

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

Aluno aluno = new Aluno();aluno.nome=novoNome;

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

Atualizar• session.update(OBJETO) para atualizar

• session.saveOrUpdate(OBJETO) para inserir caso o objeto seja novo ou atualizar caso o objeto já tenha chave primária definida.

1-13

Hibernate

Session session = sessionFactory.openSession();

Aluno aluno = (Aluno) session.get(Aluno.class, new Integer(matricula);session.close();

Recuperar• session.load(CLASSE, CHAVE_PRIMARIA) deve ser usado

somente se tiver certeza que o objeto existe (caso não exista ocorrerá erro)

• session.get(CLASSE, CHAVE_PRIMARIA): retorna o objeto ou null caso o objeto não exista

1-14

Hibernate

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

Aluno aluno = (Aluno) session.get(Aluno.class, new Integer(matricula);

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

Apagar• session.delete(OBJETO) remove o objeto passado como parâmetro

1-15

Hibernate Criação de mapeamentos (HBM)

• Mapeamentos Objeto/relacional são usualmente definidos em um documento XML.

• O documento de mapeamento foi projetado para ser de fácil leitura e edição.

• Este mapeamento é centrado em Java, ou seja, os mapeamentos são construídos ao redor de classes persistentes e não de definições de tabela.

1-16

Hibernate

VO

package aluno;

public class Aluno{ int matricula; String nome;

int idade;}

<class name="aluno.Aluno" table="tabela_aluno"> <id name="matricula" type="int"

column="matricula">

<generator class="native"> </generator> </id>

<property name="nome" type="java.lang.String" update="true" insert="true" column="nome"

length="100"not-null="true"

/> <property name="idade" type="int" update="true" insert="true" column="idade"

not-null="true" />

</class>

+

Mapeamento

1-17

Hibernate

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">...

Criação de mapeamentos (HBM): Classes• Doctype

1-18

Hibernate

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping auto-import="false"> . . .

</hibernate-mapping>

Criação de mapeamentos (HBM): Classes• Hibernate-mapping: auto-import atributo opcional que especifica

se podemos usar classes não qualificadas (sem pacote), descritas nesse mapeamento, em consultas.

1-19

Hibernate

<hibernate-mapping auto-import="false"> <class name="aluno.Aluno" table="tabela_aluno" >... </class>

</hibernate-mapping>

Criação de mapeamentos (HBM): Classes• Class:

• name: especifica o nome da classe persistente a ser mapeada

• table: especifica o nome da tabela no banco de dados

1-20

Hibernate

<class name="aluno.Aluno" table="tabela_aluno">

<id name="id" column="id" type="int"> <generator class="native"> </generator> </id>

</class>

Criação de mapeamentos (HBM): Chave Primária• id:

• name: especifica o nome do atributo na classe

• column: especifica o nome do atributo na tabela do BD

• type: tipo do atributo (EM JAVA)

• generator:

• class: especifica o gerador de chave primário utilizado

1-21

Hibernate

<class name="aluno.Aluno" table="tabela_aluno">

<property name="nome" column="nome" type="java.lang.String" not-null="true" update="true" insert="true" length="100" />

</class>

Criação de mapeamentos (HBM): Atributos Simples• property:

• name: especifica o nome do atributo na classe

• column: especifica o nome do atributo na tabela do BD

• type: tipo do atributo (EM JAVA)

• not-null: se o campo pode ser nulo ou não

• insert/update: se o campo deve ser inserido ou atualizado nas operações

• length: comprimento máximo do campo (usado para determinar tipo no BD)

1-22

Hibernate

<class name="aluno.Aluno" table="tabela_aluno">

<one-to-one name="turma" column="id_turma" class="turma.Turma" cascade="none" />

</class>

Criação de mapeamentos (HBM): Associações• Um para um:

• name: especifica o nome do atributo na classe

• column: especifica o nome do atributo na tabela do BD

• class: especifica a outra classe da associação

• cascade: especifica quais operandos devem ser “cascateados” do objeto pai para o objeto associado.

1-23

Hibernate

<class name="aluno.Aluno" table="tabela_aluno">

<many-to-one name="turma" column="id_turma" class="turma.Turma" cascade="none" />

</class>

Criação de mapeamentos (HBM): Associações• Muitos para um:

• name: especifica o nome do atributo na classe

• column: especifica o nome do atributo na tabela do BD

• class: especifica a outra classe da associação

• cascade: especifica quais operandos devem ser “cascateados” do objeto pai para o objeto associado.

1-24

Hibernate Criteria (org.hibernate.criterion.Criterion)

• Representa uma query contra uma classe persistente em particular.

1-25

Hibernate

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

Criteria• Criando um Criteria: session.createCriteria(CLASSE) cria um criteria para a classe persistente passada como parâmetro

1-26

Hibernate

Criteria criteria = session.createCriteria(Aluno.class);criteria.setMaxResults(50);List alunos = criteria.list();

Criteria• Atribuindo número máximo de resultados:

criteria.setMaxResults(QUANTIDADE).

1-27

Hibernate

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

criteria.add( Restrictions.like("nome", "Glauber%") );criteria.add( Restrictions.between("matricula", 0, 10) );List alunos = criteria.list();

Criteria• Restringindo os dados a serem recuperados

(org.hibernate.criterion.Restrictions)

1-28

Hibernate

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

criteria.add( Restrictions.like("nome", "Glauber%") );criteria.add( Restrictions.or( Restrictions.eq( "matricula", new Integer(10) ), Restrictions.isNull("nome") ) );List alunos = criteria.list();

Criteria• Restringindo os dados a serem recuperados

(org.hibernate.criterion.Restrictions)

1-29

Hibernate

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

criteria.add( Restrictions.like("nome", "Glauber%") );criteria.add( Restrictions.or( Restrictions.eq( "matricula", new Integer(10) ), Restrictions.isNull("nome") ) );criteria.addOrder( Order.asc("nome") );criteria.addOrder( Order.desc("matricula") );

List alunos = criteria.list();

Criteria• Ordenando os dados a serem recuperados

(org.hibernate.criterion.Order)

1-30

Hibernate

Query q = session.createQuery("from Aluno as this where this.nome=:nome and this.idade=:idade");q.setParameter("nome", "Glauber");q.setParameter("idade", 26);

List alunos = q.list();

HQL• Como passar parâmetros

1-31

Hibernate

Query q = session.createQuery("select this from Aluno as this where this.turma.nome=:nome");

q.setParameter("nome", "Turma 5");

List alunos = q.list();

HQL• Caminhando em associações

1-32

Hibernate

Query q = session.createQuery("select this from Aluno as this where this.nome=:nome and this.idade=:idade");q.setParameter("nome", "Glauber");q.setParameter("idade", 26);

List alunos = q.list();

HQL• Como passar parâmetros

1-33

Hibernate

Query q = session.createQuery("from Aluno");

q.setMaxResults(ITENS_POR_PAGINA);q.setFirstResult(ITENS_POR_PAGINA * PAGINA_ATUAL);

List alunos = q.list();

HQL• Exemplo de paginação

1-34

Hibernate Outros Aspectos

• Lazy Loading:

• É usado para melhorar a eficiência do programa carregando objetos ou recursos somente nos contextos em que são necessários.

• É um design pattern comumente utilizado para adiar a inicialização de um objeto ou recurso até o momento em que ele é necessário.

• É utilizado para melhorar a eficiência de programas, quando utilizado de forma apropriada.

• É o oposto de Inicialização Ávida/Ansiosa (Eager Loading).

1-35

Hibernate

public class Aluno{ private int idTurma; private Turma turma = null;

public Turma getTurma() { if (turma == null) { turma = TurmaDAO.load(idTurma); } return turma; }}

Outros Aspectos • Lazy Loading: Exemplo de implementação

• Lazy initialization: Objeto ou Recurso é originalmente atribuído com valor marcador (normalmente 'null') e a cada acesso é verificado se é necessário carregamento, este ocorrendo em tempo de execução no primeiro acesso.

1-36

Hibernate Outros Aspectos

• Lazy Loading: Exemplo de implementação

• Virtual proxy: Implementa a mesma interface do Objeto ou Recurso que é carregado 'preguiçosamente', com o proxy carregando o objeto na primeira chamada a seus métodos e delegando as chamadas para o objeto real

class Aluno{ private int id; private String nome; public String getNome() { return nome; } //...}

class AlunoProxy extends Aluno{ private Aluno aluno=null; private int id; public String getNome() { if (aluno==null) aluno=AlunoDAO.load(id); return aluno.getNome(); } //...}

1-37

Hibernate

<class name="aluno.Aluno" table="tabela_aluno">

<one-to-one name="turma" column="id_turma" class="turma.Turma" cascade="none" lazy="proxy" />

</class>

Outros Aspectos • Lazy Loading: Uso do lazy loading no hibernate

1-38

Hibernate Exercício 1

• 1- Crie o diagrama de classe para uma classe Funcionario com o nome e seu codigo.

• 2- Crie o Value object para representar o diagrama descrito acima.

• 3- Crie o arquivo de mapeamento do Value Object

• 4- Configure o Hibernate para trabalhar com esse mapeamento

• 5- Crie o DAO de Funcionario

1-39

Hibernate Exercício 1

• 1- Crie o diagrama de classe para uma classe Telefone com o número e o ddd.

• 2- Crie o Value object para representar o diagrama descrito acima.

• 3- Crie o arquivo de mapeamento do Value Object

• 4- Crie o DAO de Telefone

1-40

Hibernate Exercício 2

• 1- Crie o diagrama de classe para uma agenda telefônica. Ela deve ter uma classe Telefone com o número e o ddd, e uma classe Registro com nome, email e uma lista de Telefones.

• 2- Crie os Value objects para representar o diagrama descrito acima.

• 3- Crie os arquivos de mapeamento dos Value Objects

• 4- Crie o DAO de Registro

1-41

Hibernate Exercício 3

• 1- Crie o diagrama de classe para a seguinte situação: Um aluno, representado pelo nome, pode estar matriculado em 0 ou mais turmas. Uma turma pode ter 0 ou mais alunos.

• 2- Crie os Value objects para representar o diagrama descrito acima.

• 3- Crie os arquivos de mapeamento dos Value Objects

• 4- Crie os DAO de Aluno e Turma

1-42

Hibernate Exercício 4

• 1- Crie o diagrama de classe para a seguinte situação: Um cliente, representado pelo nome, pode efetuar uma ou mais compras, cada compra pode conter um ou mais produtos, cada produto pode estar em uma ou mais vendas e uma compra só pode ser feita por um cliente. Um produto é representado por seu nome e valor.

• 2- Crie os Value objects para representar o diagrama descrito acima.

• 3- Crie os arquivos de mapeamento dos Value Objects

• 4- Crie os DAO de Cliente e Compra

• 5- Crie um método que consulte o valor total de uma compra

• 6- Crie um método que consulte o valor total de todas as compras de um determinado cliente