3 perguntas sobre xdoclet e hibernate

15 respostas
rfpsatin
  1. como faco para ele gerar uma pk com nome diferente de “id”
  2. como faco para gerar chave composta?
  3. como determinar precisa em campos numericos

salve pessoal, se puderem me dar uma dica eu agradeceria muito!!!

to usando xdoclet + ant pra trabalhar com o hibernate.

valeu

15 Respostas

caiofilipini
rfpsatin:
1) como faco para ele gerar uma pk com nome diferente de "id"
/**
 * @hibernate.id
 *   column="CODIGO"
 *   generator-class="native"
 */
public Long getId() {
    return id;
}

[]'s

rfpsatin

boa, e pra gerar PK quando eh chave composta?
Alguem tem uma dica!!!

abracao…

maresp
public class Classe {
   private Pk pk;
   ...
   
   /**
    * @hibernate.id
    */
   private Pk getPk() {
      return pk;
   }
}

public class Pk {
   private String campo1;
   private String campo2;

   /**
    * @hibernate.property column = "col_1"
    */
   public String getCampo1() {
      return campo1;
   }

   /**
    * @hibernate.property column = "col_2"
    */
   public String getCampo2() {
      return campo1;
   }

   // setters
}
rfpsatin

Salve… havia visto esta forma. Nao ha outra forma de definir chave composta sem criar uma classe para isso?

Tenho ± 20 tabelas que possuem chave composta… vou ter que criar 20 classes soh para isso? Que pena!!!

Vocë teria um exemplo + completo que vc pudesse postar aqui?

desde ja muito obrigado.

maresp

Não existe uma tag para composite-id no xdoclet (me parece que está em desenvolvimento). Mas a definição da classe não é uma exigência do xdoclet é uma orientação da especificação do hibernate quando se trabalha com chaves compostas. Imagine algo como:

session.load(Classe.class, pk);

Como utilizar o método load sendo que a chave corresponde a um parâmetro apenas?
Agora um desabafo pessoal… estou tendo problemas com a utilização de chaves compostas com hibernate. Antes de me apredejarem já fica avisado que não fui eu que decidí utilizar composite-id - pelo contrário, fiz de tudo pra mostrar e convencer que isso era no mínimo inviável com o hibernate. Vou postar um tópico sobre meus problemas.
Mas voltando ao seu problema, que tipo de exemplo vc gostaria de ver?

rfpsatin

maresp:
Não existe uma tag para composite-id no xdoclet (me parece que está em desenvolvimento). Mas a definição da classe não é uma exigência do xdoclet é uma orientação da especificação do hibernate quando se trabalha com chaves compostas. Imagine algo como:

session.load(Classe.class, pk);

Como utilizar o método load sendo que a chave corresponde a um parâmetro apenas?
Agora um desabafo pessoal… estou tendo problemas com a utilização de chaves compostas com hibernate. Antes de me apredejarem já fica avisado que não fui eu que decidí utilizar composite-id - pelo contrário, fiz de tudo pra mostrar e convencer que isso era no mínimo inviável com o hibernate. Vou postar um tópico sobre meus problemas.
Mas voltando ao seu problema, que tipo de exemplo vc gostaria de ver?

Salve amigo, obrigao pelas dicas…

seguinte, como disse, estamos usando o xdoclet para poder trabalhar com o hibernate de forma + amigavel. Assim sendo nao estamos criando os arquivos de configuracao, esta tudo sendo desenvolvido pelas meta tags do xdoclet para trabalhar com o hibernate.

Estamos querendo gerar todo script do banco com base nos beans. Esta indo até este ponto:

Precisamos gerar os relacionamentos e estamos parados.

queria lhe pedir, se puder, um exemplo simples da seguinte forma:

uma tabela pai, exemplo -

tpai(
codigoP integer not null primary key, nome varchar2 (40) );

tfilho(
codigoP integer not null primary key, codigoF integer not null primary key, nomeF varchar2(40) );

onde::::::

a PK do tpai eh (codigoP)
a PK do tFilho eh (codigoP,codigoF)

e a uma FK de tFilho para tPai em (codigoP).

Se puder me mostrar como implementar isso usando as meta-tags do xDoclet eu agradeceria

abraco.

fique com Deus.
ricardo

rfpsatin

outra coisa, alguem sabe me informar como declaro uma UK nele para o hibernate (usando xdoclet) e este UK ser composto de + de um campo?

vai no mesmo problema de PK?

abraco

maresp
Agora vc vai entender a "naba" que é composite-id com hibernate. Vou definir apenas a classe TFilhoPk que representa a composite-id de tfilho (relacionamento many-to-one):
public class TFilhoPk {
   private TPai pai;
   private Integer codigoF;

   /**
    * @hibernate.many-to-one column = "codigoP"
    */
   public TPai getPai() {
      ...
   }

   /**
    * @hibernate.property column = "codigoF"
    */
   public Integer getCodigoF() {
      ...
   }
}
Quando ví que podia fazer isso achei que todos os meus problemas com composite-id com hibernate estavam resolvidos, mas pelo contrário, é aí que eles começavam. Por quê? Imagine uma terceira classe, ou melhor uma tabela "neta" onde na classe TNetaPk eu definisse minha composite-id, algo mais ou menos assim:
public class TNetaPk {
   private TPai pai;
   private TFilho filho;
   private Integer codigoN;
   ...
}
O que acontece aqui é que na modelagem tradicional utilizando chaves naturais (compostas) vc terá apenas um campo codigoP (codigo do pai) para ser compartilhado entre os objetos "pai" e "filho" na classe TNetaPk. E para isso vc vai precisaria (lembre-se desta palavra, precisaria) setar as propriedades "insert" e "update" do seu relacionamento many-to-one para "false".
/**
    * @hibernate.many-to-one column = "codigoP"
    */
   public TPai getPai() {
   ...
   }

   /**
    * @hibernate.many-to-one insert="false" update="false"
    * @hiberante.column name = "codigoP"
    * @hibernate.column name = "codigoF"
    */
   public TFilho getFilho() {
   ...

   }

Lembra da palavra precisaria? Pois é, o fato é que as propriedades insert e update não podem ser utilizadas dentro da tag <composite-id>. Pronto, a encrenca está armada e aí é hora de sentar e decidir se é possível alterar a estratégia de chaves para chaves substitutas invés de chaves compostas ou senão eu te digo o que talvez ninguém teve coragem de dizer até hoje: Desconsidere utilizar o hibernate com chaves compostas.

rfpsatin

Marcelo, é tão problematico assim uso de chave composta?

Descreva, por favor, os problemas que vocë tem encontrado para que possamos nao cair nos mesmos erros.

Penso em fazer o seguinte.

Trabalhar com a chave simples (apenas o ID) e para os campos que seriam minha PK (exemplo, codigo da empresa e do cliente) eu geraria uma UK para esses 2 campos. Pelo que ví, eh simples e sem problemas definir colunas UK (isso eh, + que uma coluna sendo da mesma composicao).

um abraco.

Ricardo

maresp

Bem, na minha opinião é… baseado no exemplo simples que dei no post anterior.

O problema essencial é este que passei no post anterior… não sei se vc entendeu a explicação, mas o fato é que vc não pode ter uma chave composta formada por objetos que possuem chave composta (como no relacionamento pai->filho->neto). A alternativa seria mapear os campos como propriedades sem utilizar <key-many-to-one>, porém, fazendo isso vc quebra seu modelo OO jogando 80% da funcionalidade do hibernate no lixo. Estou experimentando isso na pele e não é nada agradável fazer isso… o código fica horroroso. Se mais alguém tiver comentários sobre isso seria interessante pois já revirei o fórum do hibernate e não achei solução para esta questão.

“rfpsatin”:
Penso em fazer o seguinte.

Trabalhar com a chave simples (apenas o ID) e para os campos que seriam minha PK (exemplo, codigo da empresa e do cliente) eu geraria uma UK para esses 2 campos. Pelo que ví, eh simples e sem problemas definir colunas UK (isso eh, + que uma coluna sendo da mesma composicao).

Não entendí muito bem isso… o que seriam essas UK’s?

rfpsatin

Bom, acho que entendi o que vc havia explicado.

Pensei em forma de gambiarra.

Ao invez de ter chaves compostas, ter unique keys (formada pelos campos que seriam sua chave primaria composta). Assim vc pode ter suas chaves primarias simples (soh o ID).

Bom, no implementei isso na pratica… vc acha que resolve o problema ou da na mesma!?

maresp

rfpsatin:
Bom, acho que entendi o que vc havia explicado.

Pensei em forma de gambiarra.

Ao invez de ter chaves compostas, ter unique keys (formada pelos campos que seriam sua chave primaria composta). Assim vc pode ter suas chaves primarias simples (soh o ID).

Bom, no implementei isso na pratica… vc acha que resolve o problema ou da na mesma!?

No way man… aí vc quebra o modelo relacional… tenta imaginar um join utilizando essas tabelas com campos fundidos?

maresp

Ah… esse aqui é um problema que postei no fórum do hibernate e até agora não consegui resolver. Se alguém tiver uma dica do que pode ser fico agradecido.
http://forum.hibernate.org/viewtopic.php?t=936921

rfpsatin

boa, bons problemas…

agora marcelo, vc tem ideia de como definir campos com precisao? tipo number(10,2) ???

abraco.

rfpsatin

rfpsatin:
boa, bons problemas…

agora marcelo, vc tem ideia de como definir campos com precisao? tipo number(10,2) ???

abraco.

Eis uma forma:

/**
 * @hibernate.property
 * @hibernate.column name="opa" sql-type="number(10,2)"
 */
Criado 11 de dezembro de 2004
Ultima resposta 14 de dez. de 2004
Respostas 15
Participantes 3