Foreign key como campo da classe (Hibernate)

9 respostas
L

Bom dia a todos,

Estou usando hibernate com annotation.
Estou querendo fazem uma classe que usa a seguinte estrutura:

table pessoa(

cod_pessoa int (key)

cod_grupo int (foreign key de grupo)

nome_pessoa varchar

)
table grupo(

cod_grupo int (key)

grupo varchar

)

Na classe de Pessoa eu queria trazer o nome do grupo como campo da classe.
Se eu coloca na @Table() trazendo de uma view da erro na gravação.
Eu queria que as informações de pessoas fossem atualizas

Alguem tem alguma ideia de como fazer isso??

9 Respostas

R

Vou dar um exemplo pra vc dar uma olhada:

@Entity
@Table(name = "pessoa")
public class Pessoa implements Serializable {
    @Id
    @Column(name = "idPessoa")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer idPessoa;
    @Column(name = "nome", length = 100)
    private String nome;

    @JoinColumn(name = "Municipio_idMunicipio", referencedColumnName = "idMunicipio")
    @ManyToOne
    private Municipio municipioidMunicipio;

    //GETS E SETS
}
@Entity
@Table(name = "municipio")
public class Municipio implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer idMunicipio;
    @Column(name = "nome", length = 45)
    private String nome;
    @OneToMany(mappedBy = "municipioidMunicipio")
    private List<Pessoa> pessoaList;

    //GETS E SETS
}
L

Obrigado pela atenção, mais eu não tava querendo trazer o grupo como objeto “Grupo”, eu quero trazer como campo tipo String da Classe Pessoa.

Da maneira que vc fez eu teria de acessar pessoa.getGrupo().getNomeGrupo().
Eu quero fazer isso pessoa.getNomeGrupo(). sem a necessidade de er um objeto do tipo Grupo. lembrando tbm que não quero mascarar a informação e criar um metodo que acesse o Grupo interno para fazer isso.

Tem alguma ideia para isso??

R

Então com um pouco de criatividade:

public String getNomeGrupo(){
        return pessoa.getGrupo().getNomeGrupo();
    }
L

Mau caro foi exatamento o que eu disse que não queria fazer!

Não quero que o “nome do grupo” seja visto como um informação externa a Pessoa. Quero trazer como parte da classe e não fazer uma composição!

Teria alguma ideia para resolver isso??

R

lucaonoforum:
Mau caro foi exatamento o que eu disse que não queria fazer!

Não quero que o “nome do grupo” seja visto como um informação externa a Pessoa. Quero trazer como parte da classe e não fazer uma composição!

Teria alguma ideia para resolver isso??

E porque não fazer do jeito fácil ? Afinal de contas, o JOIN vai ser operado de qualquer maneira.

Anyway, o Hibernate provê a anotação @Formula para um campo calculado. Você pode anotar o seu campo com

@Formula("select g.nomeGrupo from Grupo g where g.codigo = codigoGrupo")
L

Mais eu to querendo o maneira mais facil. Da maneira Tradicional (a que Vcs falaram) eu teria de criar duas classes (Pessoa e Grupo) e o pior teria de acopar a classe Grupo a Pessoa.

Na solução @Formula eu iria fazer um sub-select, não vejo sendo a melhor solução.

A intensão é que a classe Pessoa funcionasse como uma view de Banco de Dados. Ele traz a informação para visualização mais não grava.

Queria no final das contas uma maneira de fazer um join com Grupo sem a necessidade de existir a classe Grupo.

Pensei em criar uma view que trouxesse as informações, mais da erro na hora de gravar porque ele tenta gravar na view.

Tem aluma forma de eu trazer as informações da view e gravar na tabela??

R

lucaonoforum:
Mais eu to querendo o maneira mais facil. Da maneira Tradicional (a que Vcs falaram) eu teria de criar duas classes (Pessoa e Grupo) e o pior teria de acopar a classe Grupo a Pessoa.

Na solução @Formula eu iria fazer um sub-select, não vejo sendo a melhor solução.

A intensão é que a classe Pessoa funcionasse como uma view de Banco de Dados. Ele traz a informação para visualização mais não grava.

Queria no final das contas uma maneira de fazer um join com Grupo sem a necessidade de existir a classe Grupo.

Pensei em criar uma view que trouxesse as informações, mais da erro na hora de gravar porque ele tenta gravar na view.

Tem aluma forma de eu trazer as informações da view e gravar na tabela??

Veja bem, o que você quer não é o jeito mais fácil, você quer é um milagre. Mapeamento ORM pressupões entidades e tabelas. Como a tabela pessoa e a tabela grupo representam entidades diferentes (cada uma tem sua PK) então cada uma tem que ser mapeada para uma classe diferente. Consequentemente, se houver ligação entre as tabelas essa associação tem que ser mapeada também, e não tem outro jeito a não ser criando referências nas classes e anotando os campos. Qualquer coisa fora disso não faz parte do escopo do ORM e você vai ter que fazer na mão. Do jeito que você quer, ou você cria o campo calculado ou então abandona a anotação de metadados, faz a consulta explicitamente com a API de queries e joga campo por campo no objeto.

L

Concordo com Vc. Porem uma View tbm é um objeto relacional e o fato de usá-la como fonte de informação de uma entidade não quebra em nada a teoria do Mapeamento Objeto Relacional.

Não quero gerar polemica ou qualquer tipo de confusão! Só que saber se tecnicamente é possível fazer, se for possível ponto para o Hibernate! Se não que q pena poderia ser uma coisa amplamente usada!

Então volta a pergunta existe alguma maneira de fazer isso??

R

Quebra, pois não há correspondência entre Views e Entidades. Views são um conceito exclusivo do modelo relacional. Talvez fosse interessante o Hibernate/JPA prover um mapeamento para classes e Views, algo como @View, mas teria que ser algo separado das entidades. Mas como eu disse, você pode fazer isso em uma consulta:

q = em.createQuery("select new PessoaView(p.codigo, p.nome, p.grupo.nome) from Pessoa p where p.id = :id");

Daí o retorno da consulta são objetos prontos, e não arrays de objetos.

Criado 25 de outubro de 2011
Ultima resposta 27 de out. de 2011
Respostas 9
Participantes 3