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
@Entity@Table(name="pessoa")publicclassPessoaimplementsSerializable{@Id@Column(name="idPessoa")@GeneratedValue(strategy=GenerationType.IDENTITY)privateIntegeridPessoa;@Column(name="nome",length=100)privateStringnome;@JoinColumn(name="Municipio_idMunicipio",referencedColumnName="idMunicipio")@ManyToOneprivateMunicipiomunicipioidMunicipio;//GETS E SETS}
@Entity@Table(name="municipio")publicclassMunicipioimplementsSerializable{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateIntegeridMunicipio;@Column(name="nome",length=45)privateStringnome;@OneToMany(mappedBy="municipioidMunicipio")privateList<Pessoa>pessoaList;//GETS E SETS}
L
lucaonoforum
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.
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
rmendes08
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
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??
R
rmendes08
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
lucaonoforum
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
rmendes08
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.