Hibernate Dúvida

5 respostas
ACDias

Olá,

Estou desenvolvendo uma aplicação onde a base de dados é de um terceiro e não posso modificá-la.
O problema é que nesta base não existe qualquer relacionamento físico, somente lógico.
Gostaria de saber se é possível configurar o Hibernate(annotations) para automaticamente popular um objeto transiente em minha entidate.
Ex:
A entidade registro:

@Entity public class Funcionario{ @Id public Integer id; @Temporal(TIMESTAMP) public Date time; } @Entity public class Registro{ @Id; public Integer id; public String nome; @Transient public Funcionario funcionario; }

É possível que em uma consulta de registros eu automaticamente popule o objeto funcionario? Na tabela existe um campo que “vincula” as duas, mas não é físico (não existe a foreign key).

Obrigado

5 Respostas

Lavieri

O hibernate não se importa sobre o relacionamento do seu banco… em resumo, não precisa existir relacionamento no seu banco, basta definilo no Hibernate…

basta remover a anotação Transient… e colocar @OneToOne ou @ManyToOne … depender de como é a relação…

@JoinColumn(name = "funcionario_id", referencedColumnName = "id") @ManyToOne(optional = false, fetch = EAGER, cascade={PERSIST,MERGE,REFRESH}) private Funcionario funcionario;

neste meu caso estou supondo que na tabela registro, vc tenha um campo chamado de “funcionario_id” se não for esse o caso, troque o nome do campo
estou ainda informando que na tabela funcionario, o campo de junção, ou seja, a ForingKey se junta no campo “id” da tabela funcionario, se não for esse o caso, troque o nome do campo…

Fora esses dados, estou falando que o objeto é populado em EAGER , ou seja, modo faminto, a consulta é feita com o inner join declarado juntos, ou seja, é feito 1 selec apenas para popular tanto o funcionario, como o registro…

estou informando ainda que existe propagação, ou seja Cascade, e que ao realizar insert em registro(persist) eu estarei juntamente inserindo o funcionario (se for preciso) ou atualizando seus dados (caso o funcionario seja persistente) … ao realizar update(merge) os dados do funcionário tb serão persistidos/atualizados … e ao realizar um refresh no registro, os dados do funcionários tb serão atualizados… porem note, que ao remover um registro, nada será feito ao funcionário, se quiser que isso se propage, adciona REMOVE ao cascade.

Os importes necessários para as anotações que citei são:

import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import static javax.persistence.FetchType.EAGER; import static javax.persistence.CascadeType.MERGE; import static javax.persistence.CascadeType.PERSIST; import static javax.persistence.CascadeType.REFRESH;

ACDias

Obrigado. Resolvi meu problema.

Gostaria de aproveitar pra tirar outra dúvida.
Estou utilizando o Hibernate juntamente com o Seam e no meu arquivo de configuração do hibernate estou mapeando um pacote:

No entanto, nos logs ele acusa que não encontrou o pacote. Quando eu configuro cada classe deste pacote individualmente, ele carrega as classes perfeitamente.

Lavieri

quando descobri como mapear um pacote todo de uma vez, me avisa tb =x … ja tentei da mesma forma ai que vc, sem sucesso… não sei como faz, acho que não deve ser assim.

ACDias

A documentação do Hibernate não especifica o que significa esse package.
E pelo que andei lendo em minhas pesquisas, não é da maneira que pensei que este mapping funciona… :?
Fiquei curioso pra saber o que esse package significa afinal…

Marky.Vasconcelos

Acho que é para fazer algo assim.

<mapping package="br.com.teste.beans" class="Classe" />

Sei lá… não uso nenhum XML de configuração.

Criado 2 de abril de 2009
Ultima resposta 3 de abr. de 2009
Respostas 5
Participantes 3