Generator - Hibernate (di novu?)

7 respostas
tads

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

7 Respostas

lcmetzger

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+

tads

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”

“<a href="http://hibernate.sourceforge.net/hibernate-mapping.dtd">http://hibernate.sourceforge.net/hibernate-mapping.dtd</a>”>

<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

lcmetzger

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”]“<a href="http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd</a>”>[/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

tads

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

lcmetzger

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

tads

Ahh! Agora sim.

Testei aqui e deu tudo certo.

Muito obrigado pela ajuda.

Abraço,

N

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

Criado 11 de setembro de 2003
Ultima resposta 31 de mar. de 2008
Respostas 7
Participantes 3