Persistência usando Hibernate

Introdução

Visão Geral

Código típico no uso do Hibernate:


...

SessionFactory sf = new Configuration().configure().buildSessionFactory();

Session session = sf.openSession();

Transaction tx = session.beginTransaction();



Cliente cliente = new Cliente();

   cliente.setNome("Maria");

   cliente.setEndereco("Endereço de Maria");

   cliente.setEmail("maria@xpto.com");



session.save(cliente);

tx.commit();

session.close();

...

Iniciando uso do Hibernate

Exemplo:

import java.io.Serializable;

import java.util.Date;



public class Cliente implements Serializable {



	private Long id;

	private String nome;

	private String endereco;

	private String email;

	private Date nascimento;

	

	public Cliente(){

	}

   

	public void setId(Long id){

		this.id = id;

	}

	

	public Long getId(){

		return id;

	}

	

	public void setNome(String nome){

		this.nome = nome;

	}

	

	public String getNome(){

		return nome;

	}

	

	...

	

	public void setNascimento(Date nascimento){

		this.nascimento = nascimento;

	}

	

	public Date getNascimento(){

		return nascimento;

	}

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

<!DOCTYPE hibernate-mapping PUBLIC "

	-//Hibernate/Hibernate Mapping DTD 2.0//EN"

	 "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

	 

	<hibernate-mapping>

	

  		<class name="Cliente" table="CLIENTE">

			<id column="CLIENTE_ID" name="id" type="java.lang.Long">

				<generator class="sequence"/>

			</id>

		

			<property

				column="NOME"

				length="50"

				name="nome"

				not-null="true"

				type="java.lang.String"

			/>



				...



  			<property

				column="DATRA_NASCIMENTO"

				name="nascimento" 

				type="java.util.Date"

			/>

  		</class>

  </hibernate-mapping>

<!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.MySQLMyISAMDialect</property>

			<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>

			<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/exemplo</property>

			<property name="hibernate.connection.username">root</property>

			<property name="hibernate.connection.password">r00Tp@$wd</property>

			

			<mapping-resource="Cliente.hbm.xml"/>

		</session-factory>

  </hibernate-configuration> 

Mais sobre mapeamento:

Mapeamento de Associações

<many-to-one name="cliente" 

        	column="CLIENTE_ID"

        	class="Cliente"

        	not-null="true"/>
<one-to-one name="usuario" class="Usuario"/>

Mapeamento de Coleções

<set name="enderecos" table="ENDERECOS">

   <key column="CLIENTE_ID"/>

	<element column="endereco" type="string"/>

</set>
<set name="dependentes" inverse="true">

	        	<key column="CLIENTE_ID"/>

	        	<one-to-many class="Dependente" />

</set>

<many-to-one name="cliente" 

        	column="CLIENTE_ID"

        	class="Cliente"

        	not-null="true"

/>

Mapeamento de Herança

 

<class name="Pessoa" table="PESSOA">

    <id name="id" type="long" column="PESSOA_ID">

        <generator class="native"/>

    </id>

    <discriminator column="TIPO_PESSOA" type="string"/>

    <property name="nome" column="NOME"/>

    ...

    <subclass name="Cliente" discriminator-value="CLT">

        ...

    </subclass>

    <subclass name="Funcionario" discriminator-value="FCN">

        ...

    </subclass>

    <subclass name="Fornecedor" discriminator-value="FRC">

        ...

    </subclass>

</class>
<class name="Pessoa" table="PESSOA">

    <id name="id" type="long" column="PESSOA_ID">

        <generator class="native"/>

    </id>

    <property name="nome" column="NOME"/>

    ...

    <joined-subclass name="Cliente" table="CLIENTE">

        <key column="PESSOA_ID"/>

        ...

    </joined-subclass>

    <joined-subclass name="Funcionario" table="FUCNIONARIO">

        <key column="PESSOA_ID"/>

        ...

    </joined-subclass>

	 <joined-subclass name="Fornecedor" table="FORNECEDOR">

        <key column="PESSOA_ID"/>

        ...

    </joined-subclass>

</class>
<class name="Cliente" table="CLIENTE">

    <id name="id" type="long" column="CLIENTE_ID">

        <generator class="native"/>

    </id>

    <property name="nome" column="NOME"/>

    ...

</class>

<class name="Funcionario" table="FUNCIONARIO">

	<id name="id" type="long" column="FUNCIONARIO_ID">

		<generator class="native"/>

	</id>

	<property name="nome" column="NOME"/>

	...

</class>

<class name="Fornecedor" table="FORNECEDOR">

	<id name="id" type="long" column="FORNECEDOR_ID">

		<generator class="native"/>

	</id>

	<property name="nome" column="NOME"/>

  ...

</class>
<any name="pessoa"

        meta-type="class"

        id-type="long">

    <column name="PESSOA_CLASS"/>

    <column name="PESSOA_ID"/>

</any>

Consultas

Consultas HQL

from Pessoa pessoa where upper(pessoa.nome) like 'MARIA%'
Query q = session.createQuery("from Pessoa pessoa where upper(pessoa.nome) like :NOME");

q.setProperties(nome);

List pessoas = q.list();

Criteria Queries

Criteria consulta = sess.createCriteria(Pessoa.class);

consulta.add( Expression.like("nome", "Maria%") );

consulta.add( Expression.between("idade", 18, 40) );

List resultado = consulta.list();

 

Considerações

Recursos

daca programa