1. Configurando o Hibernate para ser usado. 2. Obtendo

Transcrição

1. Configurando o Hibernate para ser usado. 2. Obtendo
1. Configurando o Hibernate para ser usado.
Config. 1
Configuration cfg = new Configuration()
.addFile("Vertex.hbm.xml")
.addFile("Edge.hbm.xml");
Config. 2
Configuration cfg = new Configuration()
.addClass(eg.Vertex.class)
.addClass(eg.Edge.class);
Config. 3
Properties props = new Properties();
...
Configuration cfg = new Configuration()
.addClass(eg.Vertex.class)
.addClass(eg.Edge.class)
.setProperties(props);
Método .addFile(<Arquivo>)
Adiciona o arquivo .hbm.xml que contém o mapeamento da classe para realização da persistência na
configuração do hibernate
Médodo .addClass(<arquivo.class>)
Adiciona a classe do objeto a ser instanciado, porém é necessário o arquivo .hbm.xml que comtém o
mapeamento da classe para realização da persistência.
Método .setProperties(<arquivo de propriedades>)
Define as propriedades de conexão do banco de dados pelo arquivo de propriedades.
2. Obtendo sessão, abrindo e fechando conexão no hibernate
* Para criar uma sessão use:
SessionFactory factory = cfg.buildSessionFactory();
onde cfg é um objeto do tipo Configuration
* Para abrir uma seção
Session session = factory.openSession();
* Verificar se a sessão foi aberta
boolean session.isOpen();
* Fechando uma conexão
session.close();
3. Transações
* Para iniciar uma transação
Transaction transaction = session.beginTransaction();
* Para comitar uma transação
void transaction.commit();
* Para cancelar uma transação (Rollback)
void transaction.rollback();
Atenção: Para salvar um registro você deve usar uma transação e dar um commit, ou usar o método
abaixo (testei com o IB, e não deu muito certo)
void session.flush();
Teoricamente o session.flush() limpa o buffer da sessão e confirma a gravação das alterações.
4. Gravando, Atualizando, Excluindo e Recuperando registros (CERA)
4.1. Gravando um registro
Session session = factory.openSession();
session.save(<objeto_tabela>);
4.2. Atualizando um registro
Session session = factory.openSession();
session.update(<objeto_tabela>);
4.3. Excluindo um registro
Session session = factory.openSession();
session.delete(<objeto_tabela>);
4.4. Recuperando um registro
Session session = factory.openSession();
<classe> <variável> = (<classe>)session.load(<classe>.class, <valor da pk>);
Exemplo:
Session session = factory.openSession();
Amigo amigo = (Amigo)session.load(Amigo.class, 12);
4.5. Recuperando uma lista de registros
Session session = factory.openSession();
java.util.List lista = session.find(String query);
java.util.List lista = session.find(String query, Object[] value, Type tipo);
java.util.List lista = session.find(String query, Object value, Type tipo);
* query --> string contendo a consulta
* value --> Objeto (podendo ser um array) contendo os valores para “?” (? - parametros no JDBC)
* tipo --> Tipo de dados do Hibernate (Hibernate.STRING, Hibernate.INTEGER)
4.5.1. Exemplo de condições (linguagem de consulta do hibernate)
Exemplo 1
String stQuery = “select mate from Cat as cat join cat.mate as mate” +
“ where cat.name = ?“;
List lista = session.find(stQuery,“O GATO“,Hibernate.STRING);
Exemplo 2
String stQuery = “from Amigo as amigo where amigo.nome = “FULANO””;
List amigo = session.find(stQuery);
*** a linguagem é igual ao SQL Ansi99.
5. Criando consultas com a interface Query
5.1. Criando uma query:
Query q = sess.createQuery("from Amigo amigo");
List amigo = q.list();
//Cria a consulta
//Retorna uma lista dos resultados
5.2. Criando uma query parametrizada
/* parametro nomeado (preferencial) */
Query q = sess.createQuery("from Amigo amigo where" +
"amigo.nome = :name");
q.setString("name", "Jose");
Iterator amigo = q.iterate(); or List amigo = g.list();
//Cria a query
//Define valor do parametro
//Recupera a lista de reg.
/* parametro posicionado */
Query q = sess.createQuery("from Amigo amigo where" +
"amigo.nome = ?");
//Cria a query
q.setString(0, "Jose");
//Define valor do parametro
Iterator amigo = q.iterate(); or List amigo = g.list(); //Recupera a lista de reg.
/* lista de parametros */
List params = new ArrayList();
params.add("Jose");
params.add("Maria");
Query q = sess.createQuery("from Amigo amigo where" +
"amigo.nome in (:namesList)");
q.setParameterList("namesList", params); //Define valor da lista de
List amigo = g.list();
//Recupera a lista de reg.
parametros
public Query createQuery(String queryString) throws HibernateException
Parameters:
queryString - String contendo a a consulta do hibernate
5.3. Consultas em SQL nativo use createSQLQuery().
List amigo = session.createSQLQuery(
"SELECT {amigo.*} FROM Amigo AS {amigo} WHERE amigo.nome = 'Jose'",
"amigo",
Amigo.class).list();
String sql = "select cat.originalId as {cat.id}, cat.mateid as {cat.mate}, " +
" cat.sex as {cat.sex}, cat.weight " +
" from cat_log cat where {cat.mate} = :catId"
List loggedCats = session.createSQLQuery(sql, "cat", Cat.class)
.setLong("catId", catId)
.list();
* o {cat.id} representa a propriedade da classe que representa o campo.
* o {amigo.*} diz que todos os campos da tabela amigo, tem o mesmo nome das propriedades da classe
Amigo.
public Query createSQLQuery (String sql,
String returnAlias,
Class returnClass)
Parameters:
sql - consult em SQL
returnAlias - alias da tabela entre { } dentro do SQL que representa a classe.
returnClass - Classe de retorno dos dados da consulta.
public Query createSQLQuery (String sql,
String[] returnAliases,
Class[] returnClasses)
Parameters:
sql - consult em SQL
returnAliases - conjunto de alias da tabela entre { } dentro do SQL que
representa a classe.
returnClasses - conjunto de classes de retorno dos dados da consulta.
5.4. Filtrando coleções (Collection session.filter();)
Aplica um filtro em uma coleção persistente. Um filtro é uma consulta do
Hibernate.
Collection blackKittens = session.filter(pk.getKittens(),
"where this.color = ?",
Color.BLACK,
Hibernate.enum(Color.class));
public Collection filter(Object collection,
String filter) throws HibernateException
Parameters:
collection - a persistent collection to filter
filter - a filter query string
public Collection filter (Object collection,
String filter,
Object value,
Type type) thows HibernateException
Parameters:
collection - a persistent collection to filter
filter - a filter query string
value - a value to be witten to a "?" placeholder in the query string
type - the hibernate type of value
public Collection filter (Object collection,
String filter,
Object[] values,
Type[] types) thows HibernateException
Parameters:
collection - a persistent collection to filter
filter - a filter query string
values - a list of values to be written to "?" placeholders in the query
types - a list of Hibernate types of the values
6. Arquivo de Configuração (.hbm.xml)
6.1. Declaração do Mapeamento.
Exemplo
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package="eg">
<class name="Cat" table="CATS" discriminator-value="C">
<id name="id" column="uid" type="long">
<generator class="hilo"/>
</id>
<discriminator column="subclass" type="character"/>
<property name="birthdate" type="date"/>
<property name="color" not-null="true"/>
<property name="sex" not-null="true" update="false"/>
<property name="weight"/>
<many-to-one name="mate" column="mate_id"/>
<set name="kittens">
<key column="mother_id"/>
<one-to-many class="Cat"/>
</set>
<subclass name="DomesticCat" discriminator-value="D">
<property name="name" type="string"/>
</subclass>
</class>
<class name="Dog">
<!-- mapping for Dog could go here -->
</class>
</hibernate-mapping>
6.1.1. hibernate-mapping
<hibernate-mapping
schema="schemaName"
default-cascade="none|save-update"
auto-import="true|false"
package="package.name"
/>
1.
2.
3.
(1)
(2)
(3)
(4)
(optional): Nome do schema do database.
(optional - defaults to none): Estilo cascata (cascade style) padrão.
auto-import (optional - defaults to true): especifica se pode usar um nome de classe (definidas neste
mapeamento) não adequado na linguagem de consulta.
4. package (optional): Especifica um prefixo do pacote para assumir um nome de classe não qualificado no
documento de mapeamento.
schema
default-cascade
6.1.2. class
Declaração da classe persistente use class
<class
name="ClassName"(1)
table="tableName“(2)
discriminator-value="discriminator_value"(3)
mutable="true|false“(4)
schema="owner" (5)
proxy="ProxyInterface" (6)
dynamic-update="true|false"(7)
dynamic-insert="true|false"(8)
select-before-update="true|false"(9)
polymorphism="implicit|explicit"(10)
where="arbitrary sql where condition"(11)
persister="PersisterClass"(12)
batch-size="N"(13)
optimistic-lock="none|version|dirty|all"(14)
lazy="true|false"(15)
/>
1.
2.
3.
name:
nome completo e qualificado de uma classe Java de uma classe ou interface persistente.
Nome da tabela no banco de dados.
discriminator-value (opcional - padrão para o nome da classe): Um valor para distinguir subclasses
individuais. Usado para comportamento polimorfo. Aceita valores inclusive null e not null.
4. mutable (opcional, padrão true): Especifica se a instancia da classe é ou não mutante.
5. schema (opcional): Sobrepõe o nome do Schema specificado no elemento raíz (<hibernate-mapping>).
6. proxy (opcional): Especifica uma interface para uso de inicialização de proxies lentos. Você possivelmente
especifica o nome da propria classe.
7. dynamic-update (opcional, padrão false): Especifica que o SQL de UPDATE Somente será gerado em runtime
e contendo apenas as colunas que tiveram seus dados alterados.
8. dynamic-insert (opcional, padrão false): Especifica que o SQL de INSERT Somente será gerado em runtime
e conterá apenas os valores das colunas com valores diferentes de null.
9. select-before-update (opcional, padrão false): Especifica se o Hibernate deverá executar um SQL para
atualizar os registros para ter certeza de que o objeto foi atualizado.
10.polymorphism (opcional, padrão implicit): Determina se será usado uma consulta polimorfa implicita ou
explicita.
11.where (opcional) especifica com uma clausula WHERE, uma condição para trazer os objetos desta classe.
12.persister (opcional): Especifica uma ClassPersister customizada.
13.batch-size (opcional, padrão 1) especifica um “batch size” (tamanho do lote) para trazer instancias desta
classe.
14.optimistic-lock (opcional, padrão version): determina a estratégia otimista de “locking” de registro.
15.lazy (opcional): Definindo lazy="true" is é uma nome curto equivalente para especificar o nome da própria
classe para uma interface de proxy.
table:
Estas definições são também aceitas na seção <subclass> que realizam a persistência de classes internas
(inner class).
6.1.3. id
Definição da chave primária da classe (tabela)
<id
name="propertyName"(1)
type="typename"(2)
column="column_name"(3)
unsaved-value="any|none|null|id_value"(4)
access="field|property|ClassName">(5)
<generator class="generatorClass"/>
</id>
name (opcional): O nome para identificar a propriedade.
type (opcional): Um nome apra indicar o tipo no Hibernate.
column (opcional - padrão o nome da propriedade): O nome da coluna de chave primaria.
unsaved-value (opcional - padrão null): Uma uma valor para a propridade para indicar uma
nova instancia cujo
o valor não for definido.
access (opcional - defaults to property): Estratégia necessária para o hibernate acessar o valor da propriedade.
O <composite-id> é uma alterantiva para tabelas com chaves compostas, porém é fortemente
desencorajada o seu uso, porém pode se fazer necessário o seu uso.
6.1.4. generator
Elemento filho utilizado para gerar identificadores unicos para instancias das classes persistentes.
<id name="id" type="long" column="uid" unsaved-value="0">
<generator class="net.sf.hibernate.id.TableHiLoGenerator">
<param name="table">uid_table</param>
<param name="column">next_hi_value_column</param>
</generator>
</id>
- gera identificadores do tipo long, short ou int este é unico somente em outro processo de inserção
de dados na mesma tabela. Não use em um cluster.
increment
suporte às colunas identificadas (identity) no DB2, MySQL, MS SQL Server, Sybase e
HypersonicSQL. O retorno é identificado como tipo long, short ou int.
identity -
usa a sequencia (sequence) do DB2, PostgreSQL, Oracle, SAP DB, McKoi or um generator no
Interbase. O retorno do identificador é do tipo long, short ou int
sequence -
usa um algoritimo hi/lo para gerar um eficiente identificador do tipo long, short ou int, dado a tabela e
a coluna (por default hibernate_unique_key e next respectivamente) para uma fonte de valores altos. O
algoritimo hi/lo gera identificadores que são unicos somente para uma base de dados particular. Não use este
generator com conexões inscritas com JTA ou com uma user-supplied connection.
hilo -
usa algoritimo hi/lo para gerar um eficiente identificador do tipo long, short or int, dado a tabela e o
nome do database sequence.
seqhilo -
usas um algoritimo de 128-bit UUID para gerar identificadores do tipo string, unicos na rede (o
endereço IP é usado). O UUID é codificado em uma string de digitos hexadecimais de 32 digitos de tamanho.
uuid.hex -
usa o mesmo algoritimo UUID. O UUID é codificado em uma string de 16 caracteres ASCII. Não
usar com o PostgreSQL.
uuid.string -
native - Pega o identity, sequence
ou hilo dependendo da capacidade do database.
assigned -
a aplicação define o identificador para o objeto antes do save() ser chamado.
usa o identificador de outro objeto associado. Comumente usado em conjunto com uma chave primária
de uma associação <one-to-one>.
foreign -
6.1.5. composite-id
Exemplo 1
<composite-id
name="propertyName"
class="ClassName"
unsaved-value="any|none"
access="field|property|ClassName">
<key-property name="propertyName" type="typename" column="column_name"/>
<key-many-to-one name="propertyName class="ClassName" column="column_name"/>
......
</composite-id>
Exemplo 2
<composite-id>
<key-property name="medicareNumber"/>
<key-property name="dependent"/>
</composite-id>
• name (opcional): Um propriedade do tipo de componente para passar o identificador composto.
• class (opcional - padrão o tipo de propriedade determinado para reflecção (reflection)): A classe componente
usada para o identificador composto.
• unsaved-value (opcional - padrão none): indica a instancia transiente necessária para uma nova instanciação, se
definido para any.
6.1.6. timestamp (opcional)
<timestamp
column="timestamp_column"(1)
name="propertyName"(2)
access="field|property|ClassName"(3)
unsaved-value="null|undefined"(4)
/>
•
•
•
column (opcional - padrão o nome da propriedade): O nome de uma coluna proprietaria do TimeStamp.
name: O nome de um estilo de propriedade do JavaBeans do tipo Date or Timestamp de uma classe persistente.
access (opcional - padrão property): A estratégia do Hibernate necessária para uso no acesso ao valor da
propriedade.
•
(opcional - padrão null): Um versão do valor da propriedade para indicar se uma instancia foi
recentemente instanciada (unsaved).
unsaved-value
6.1.9. property
A tag <property> define a persistencia da classe no estilo de propriedade JavaBeans.
<property
name="propertyName" (1)
column="column_name"(2)
type="typename"(3)
update="true|false"(4)
insert="true|false"(4)
formula="arbitrary SQL expression"(5)
access="field|property|ClassName"(6)
/>
1.
2.
name:
o nome da propriedade, com uma letra inicial em minuscula.
column (opcional - padrão o nome da propriedade): o nome da coluna da tabela do banco de dados mapeado.
3.
4.
(opcional): um nome para indicar o tipo no Hibernate.
(opcional - padrão true): especifições para as colunas mapeadas que necessitam ser incluidas
no enunciado do SQL UPDATE e/ou INSERT. Definindo ambos para false permite uma propriedade puramente
derivada do qual o valor é inicializado à alguma outra propriedade mapeada para a mesma coluna ou por uma
trigger ou outra aplicação.
5. formula (opcional): uma expressão SQL para definir o valor para uma propriedade computed. Propriedade
Computed não tem uma coluna mapeada pertencente a ele.
6. access (opcional - padrão property): A estratégia do Hibernate necessária acessar o valor da propriedade.
type
update, insert
6.1.10. many-to-one
Para definir uma associação com outras classe persistente use a tag <many_to_one>. No modelo
relacional é a associação many-to-one.
<many-to-one
name="propertyName"(1)
column="column_name"(2)
class="ClassName"(3)
cascade="all|none|save-update|delete"(4)
outer-join="true|false|auto"(5)
update="true|false"(6)
insert="true|false"(6)
property-ref="propertyNameFromAssociatedClass"(7)
access="field|property|ClassName"(8)
/>
1.
2.
3.
4.
5.
6.
7.
8.
name: O nome da propriedade.
column (opcional): O nome da coluna.
class (opcional - padrão o tipo da propriedade determinada para reflexão): O nome da classe associativa.
cascade (opcional): Especifica quais operações serão realizadas para cascatear a partir do objeto pai para o
objeto associado.
outer-join (opcional - padrão auto): habilita recuperação de outer-join para esta associação quando
definido hibernate.use_outer_join.
update, insert (opcional - padrão true) especifica para a coluna mapeada se será incluido o enunciado
do SQL de UPDATE e/ou INSERT. Definindo ambos para false permite uma associação pura com valor
inicializado a partir da mesma propriedade para o mapa da mesma coluna ou por uma trigger ou outra
aplicação.
property-ref: (opcional) Nome de uma propriedade da classe associada para ligação atravéz de uma chave
estrangeira. Se na for especificado, a chave primária será usada para associar a classe.
access (opcional - padrão property): Estratégia usada pelo Hibernate no acesso ao valor da propriedade.
Uma declaração simples de <many-to-one>:
<many-to-one name="product" class="Product" column="PRODUCT_ID"/>
6.1.11. one-to-one
Para relacionamentos um-para-um.
<one-to-one
name="propertyName"
class="ClassName"
cascade="all|none|save-update|delete"
constrained="true|false"
outer-join="true|false|auto"
property-ref="propertyNameFromAssociatedClass"
access="field|property|ClassName"
/>
1.
2.
3.
4.
name:
(1)
(2)
(3)
(4)
(5)
(6)
(7)
O nome da propriedade.
class (opcional - padrão o tipo da propriedade determinado para reflexão): O nome da classe associada.
cascade (opcional) especifica para quais operações serão cascateadas para do objeto pai do objeto associado.
constrained (opcional) especifica que a constraint de chave estrangeira será a chave primaria da tabela
mapeada referenciando a tabela da classe associativa. Esta opção afeta a ordem em que save() e delete()
serão cascateada (e é além disso é usada na ferramenta de exportação do schema).
5. outer-join (opcional - padrão auto): habilita recuperação de outer-join para a associação que o
hibernate.use_outer_join definir
6. property-ref: (opcional) O nome da propriedade da classe associada que é ligada com a chave primária desta
classe. Se não especificado, a chave primária da classe associada será usada.
7. access (opcional - padrão property): A estratégia do Hibernate que será usada para acessar o valor da
propriedade.
Person,
Para uma associação pela chave primária, adicionando o seguinte mapeamento para Employee and
respectivamente.
<one-to-one name="person" class="Person"/>
<one-to-one name="employee" class="Employee" constrained="true"/>
No caso anterior, a associação das classes será feita pela chave primária da tabela que foi associada, no
caso chave primária da tabela Person e Employee.
6.1.12. subclass
<subclass
name="ClassName"
discriminator-value="discriminator_value"
proxy="ProxyInterface"
lazy="true|false"
dynamic-update="true|false"
dynamic-insert="true|false">
<property .... />
.....
</subclass>
(1)
(2)
(3)
(4)
✑✎name: Nome qualificado completo da subclass.
✒✎discriminator-value (opcional - padrão o nome da classe): Um valor que distingue uma subclasse
individual.
✓✎proxy (opcional): Especifica uma classe ou interface para ser usada em iniciar proxies.
✔✎lazy (opcional): Definindo lazy="true" é um atalho equivalente para especificar o nome de uma classe para
si próprio para a interface proxy.
6.1.13. joined-subclass
Alterantivamente, uma subclasse para persistencia de uma tabela (estratégia de mapeamento table-persubclass) é declarada usando o elemento <joined-subclass>.
<joined-subclass
name="ClassName"
proxy="ProxyInterface"
lazy="true|false"
dynamic-update="true|false"
dynamic-insert="true|false">
<key .... >
<property .... />
.....
</subclass>
(1)
(2)
(3)
✑✎name: O nome completo qualificado da classe da subclasse.
✒✎proxy (opcional): Especifica uma classe ou interface para iniciar o uso de proxies.
3.
(opcional): Definindo lazy="true" o um atalho equivalente especificado no nome da classe será usado
para em uma interface proxy.
lazy
6.1.14. import
Suponha que sua aplicação tenha duas classes persistentes com o mesmo nome, e você não que especificar o
nome qualificado completo (package) nas consultas do Hibernate.
<import class="java.lang.Object" rename="Universe"/>
<import
class="ClassName"
rename="ShortName"
/>
(1)
(2)
1. class: O nome completo qualificado da classe de qualquer classe Java.
2. rename (opcional - padrão o nome não qualificado da classe) : Um nome para ser usado na linguagem de
consulta.
7. Hibernate Types
integer, long, short, float, double, character, byte, boolean, yes_no, true_false
Tipos primitivos mapeados para Java ou cobertura da classe para o tipo da coluna do SQL apropriada. boolean,
yes_no e true_false are são todos alternativos codificando para um Java boolean ou java.lang.Boolean.
string
Um tipo mapeado do java.lang.String para VARCHAR (ou Oracle VARCHAR2).
date, time, timestamp
Tipo mapeado a partir de java.util.Date and e subclasses para tipo SQL DATE, TIME e TIMESTAMP (ou
equivalente).
calendar, calendar_date
Tipo mapeado de java.util.Calendar
para tipos SQL TIMESTAMP e DATE (ou equivalente).
big_decimal
Um tipo mapeado de java.math.BigDecimal para NUMERIC (ou Oracle NUMBER).
locale, timezone, currency
Tipo mapeado de java.util.Locale, java.util.TimeZone
VARCHAR2). Instancias de Locale e Currency são mapeada
mepeadas para o mesmo ID.
e java.util.Currency para VARCHAR (ou Oracle
para os codigos ISO. Instancias de TimeZone são
class
Um tipo mapeado de java.lang.Class para VARCHAR (ou Oracle VARCHAR2). Uma Class é mapeada para o nome
completo qualificado.
binary
Array de mapa de byte para um apropriado tipo binário do SQL.
text
Mapea Strings longas do Java para um tipo SQL CLOB ou TEXT.
serializable
Mapea tipo Java serializable para um tipo binário do SQL apropriado. Voce além disso pode indicar o tipo
Hibernate serializable com o nome de uma classe serializable do Java ou interface para fazer notdefault para
um tipo basico ou implementação PersistentEnum.
clob, blob
Tipo mapeados para a classe do JDBC java.sql.Clob e java.sql.Blob. Estes tipos talvez sejam inconvenientes
para algumas aplicações, desde que o os objetos blob ou o clob não sejam reutilizados fora de uma transação.
8. Mapeando Coleções

Documentos relacionados

Hibernate - Leandro Guarino

Hibernate - Leandro Guarino import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.cfg.Configuration; public...

Leia mais

Hibernate Reference PT - Desenvolvido com Futurepages

Hibernate Reference PT - Desenvolvido com Futurepages 5.1.5. composite-id ......................................................................................................... 57 5.1.6. discriminator ..................................................

Leia mais