Generator - Hibernate (di novu?)

Bom dia pessoal, blz??? :stuck_out_tongue:

Eu de novo com alguns pequenas dúvidas no hibernate.
Qual seria a melhor classe para se gerar identificador único,
não importando qual base de dados usar???

Estou tentando usar o native, mas não estou conseguindo.
Talvez porque eu não tenha achado nenhum exemplo deste.

Valew,

abraço

Como você mesmo sugeriu, utilize native! :slight_smile:

Bom, qual a versão do hibernate que vc está utilizando? Acho que você poderia postar a tag xml para verificar o problema!

t+

Intão, eu tbm acho que usar native fica melhor, mais portável,
mas quando eu o uso, ele inicia com “zero” e o próximo
q eu insiro também usa este valor. (Exception a vista)

Estou usando o Hibernate 2.0.2 e oracle.
Tenho até uma sequência para a tabela,
(usei o generator sequence, mas menos portável)
Talvez nem precise usar a sequencia
e o próprio generator (native) gera o valor apropriado.

Olha o xml aí…

<?xml version=“1.0”?>
<!DOCTYPE hibernate-mapping PUBLIC
“-//Hibernate/Hibernate Mapping DTD/EN”
http://hibernate.sourceforge.net/hibernate-mapping.dtd”>
<hibernate-mapping>
<class name=“dao.Customer” table=“customer”>

<generator class=“native” />

<property name=“naCustomer” column=“na_customer” type=“string”/>
<property name=“address” column=“address” type=“string”/>
<property name=“city” column=“city” type=“string”/>
</class>
</hibernate-mapping>

Valew pela atenção,

Abraço

Hummm, fique atento para o arquivo DTD (valida o seu XML) pois não está sendo utilizado o arquivo para a versão 2.0. Não sei o nome do sequence que vc está utilizando, vou simplesmente chama-la de MINHA_SEQ e depois vc substitue. A Sequence é necessária para que o Hibernate funcione corretamente (Se for, por exemplo um banco MySQL, o Hibernate iria ignorar a TAG do sequence), e criei uma coluna chamada ID que representa minha Primary Key no Oracle.

<?xml version=“1.0”?>
<!DOCTYPE hibernate-mapping PUBLIC
“-//Hibernate/Hibernate Mapping DTD/EN”
[color=“blue”]http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd”>[/color]
<hibernate-mapping>
<class name=“dao.Customer” table=“customer”>

[color=“blue”]
< id
name=“id”
column=“ID”
type=“long”>
<generator class=“native”>
<param name=“sequence”>MINHA_SEQ</param>
</generator>
< /id>[/color]

<property name=“naCustomer” column=“na_customer” type=“string”/>
<property name=“address” column=“address” type=“string”/>
<property name=“city” column=“city” type=“string”/>
</class>
</hibernate-mapping>

Espero que o exemplo lhe ajude,
Valeu!!

Luiz Carlos Metzger

Entendi… bobiei nesta…

Bom, no seu exemplo vc usa native, mas tbm usa sequence (Oracle).

No caso se o cliente resolver mudar de SGDB, por exemplo o
SQL Plus, como ficaria para permitir vários tipos de incremnentos
de vários bancos diferentes???

Obrigado,

Abraço

Essa é a moral da história!

Se o Cliente mudar, por exemplo para o MySQL, o mesmo não possue o conceito de “sequences”, mas sim, com campos auto-incremento. O Hibernate “sabe” que você está utilizando o MySQL, e ira ignorar a TAG onde você aponta o nome de sua sequence.

Outro exemplo seria o banco Firebird (Fork do Interbase 6.0), ele utiliza o mesmo conceito do Oracle, mas com diferenças na sintaxe, o Hibernate “sabe” que está sendo utilizando o Firebird e ele tratara as diferenças. Segue exemplo de como o Firebird/Interbase gera incrementos:

Para criar um generator(o mesmo que sequence do oracle):
CREATE GENERATOR MINHA_SEQ;

para se gerar e obter um incremento:
SELECT GEN_ID(MINHA_SEQ,1) FROM RDB$DATABASE;

Valeu!!!

Luiz Carlos Metzger

Ahh! Agora sim.

Testei aqui e deu tudo certo.

Muito obrigado pela ajuda.

Abraço,

A idéia de que ele ignora o generator de sequence para um banco que não suporta sequence não funcionou com Hibernate JPA usando annotations.

Abraço