Associaçao de uma coluna com multiplos objetos

6 respostas
arnishi

É o seguinte:

  • Tenho uma classe mapeada (arquivo xml) à uma tabela pelo hibernate 3. A minha duvida é, uma das colunas da tabela guarda valores que podem ser valores simples (inteiros, texto, data) e valores que referenciam um outro registro (como se fosse uma FK). Essas referencias (ids de outros registros) nao estao relacionadas ao mesmo tipo/tabela. Tem como eu criar uma associaçao à essa coluna que retorne os objetos dos tipos possiveis? Esse retorno estaria relacionado a uma condiçao do valor da outra coluna.

Ex: se nome_param = ‘agecliente’ deveria retornar um objeto agencia
se nome_param = ‘codlogradouro’ deveria retornar um objeto logradouro
se nome_param = ‘data_limite’ deveria retornara simplesmente uma string (ou Date)

tudo isso vindo de uma mesma coluna.
É possivel?

(n sei se expliquei direito, na verdade estou começando a ‘descobrir’ o hibernate, nao tenho muita experiencia)

6 Respostas

GraveDigger

Isso está bem estranho.

Se os objetos fossem da mesma hierarquia(todos derivados de uma classe pai, mapeada, comum) tudo bem.

Mas não parece esse seu caso.

Qual a idéia exata de sua tabela ? Me parece que a proposta da tabela não está boa.

Abraço,

Pedro Sena

arnishi

Ola GraveDigger

Esta tabela serve para gravar os parametros usados pelo sistema. Entao, ela está construida com as seguintes colunas:

  1. CODIGO_PARAMETRO
  2. DESCRICAO_PARAMETRO
  3. TIPO_PARAMETRO
  4. VALOR_PARAMETRO
  5. REFERENCIA_PARAMETRO

Todas as colunas sao Strings, inclusive o Codigo_parametro, pois ele guarda uma palavra chave para encontrar o parametro.

O modelo anterior usava cada parametro como uma coluna, deste modo, a tabela tinha apenas 1 linha. no entanto, a tabela ja estava ficando com 80 colunas, e a cada parametro novo, tinha que incluir uma nova linha.
A proposta agora, é minimizar a intevençao no banco, deixando cada parametro numa linha.
Acontece que alguns parâmetros sao referencias (códigos) de outras tabelas do banco, e objetos distintos no sistema.
Por exemplo, essa tabela tera um parametro com uma data referente a ultima alteração, e também, haverá um outro parâmetro com o Código de um logradouro -> que é relacionado à uma outra tabela logradouro, que esta por sua vez é relacionada ao objeto Logradouro.
Minha duvida é… tem como mapear para que o hibernate ja traga todos os objetos (da coluna valor), ou tenho que arranjar um meio de fazer isso na mão mesmo?

Andei pesquisando por alguns tipos de mapeamento, mas nao consegui nenhum resultado… (tentei o mapeamento ANY)

Obg pela atençao!

GraveDigger

Entendi seu problema.

Realmente sua modelagem me parece correta.

ACREDITO que uma alteração desse exemplo aqui:

http://www.hibernate.org/122.html

Possa atender suas necessidades, mas ao invés de converter para Int, vc teria que adaptar o exemplo para converter para a String que vc usa para determinar qual classe deve ser instanciada.

Espero ter ajudado.

[]'s

arnishi

Blza! Acho que entendi… vou tentar implementar aqui…
Agora, so mais uma duvida:
Pelo exemplo que vc me passou, SEMPRE será mapeado um ID de alguma classe (independentemente de ql seja essa classe, desde que esteja no CustomType do exemplo)… Mas e quando esse valor nao representar um ID? por exemplo, o valor que estiver la na coluna for um inteiro (um valor que represente uma quantidade, não uma referencia à outra entidade)… Ele vai dar erro?

Bom, tou tentando implementar aqui, retornarei pra dizer o resultado!

Muitíssimo obrigado pela dica! :slight_smile:

GraveDigger

arnishi:
Blza! Acho que entendi… vou tentar implementar aqui…
Agora, so mais uma duvida:
Pelo exemplo que vc me passou, SEMPRE será mapeado um ID de alguma classe (independentemente de ql seja essa classe, desde que esteja no CustomType do exemplo)… Mas e quando esse valor nao representar um ID? por exemplo, o valor que estiver la na coluna for um inteiro (um valor que represente uma quantidade, não uma referencia à outra entidade)… Ele vai dar erro?

Bom, tou tentando implementar aqui, retornarei pra dizer o resultado!

Muitíssimo obrigado pela dica! :slight_smile:

Oi,

Acho que esse caso de não ter o ID pode representar um problema, já que o Id é essencial para encontrar a entidade, por baixo dos panos, somado ao conteudo do exemplo, ele pega a classe, dinamicamente ao invés de forma estática, e deve fazer um find, o que necessita do id da entidade.

De qualquer forma, faça o teste e poste os resultados, talvez não seja exatamente assim como eu disse(espero que não :lol: ).

[]'s

arnishi

Bem, tivemos uma reunião e expus meu problema.
Ficou decidido que não utilizaremos nenhum mapeamento especial do Hibernate. Mesmo que se faça duas consultas, é preferível que seja feito “à mão”.

De qualquer forma, fiquei curioso de como isso funciona. Com calma em casa eu tentarei fazer algo parecido.

Em breve postarei minhas conclusões!

Criado 11 de dezembro de 2008
Ultima resposta 18 de dez. de 2008
Respostas 6
Participantes 2