1 - acho que deveria ser o contrario. O id da cidade tem que ficar na pessoa.
2 - voce esta usando hibernate annotations?
se sim o proprio relacionamento one-to-many ja te da suporte a isso!
W
Wakky
Oi cara tudo bem?
obrigado pela ajuda.
Como faço para usar o one-to-many?? Pode postar um exemplo???
Estou usando JPA
[]'s
Wakky
J
Jair_Rillo_Junior
Use a annotation @OneToMany
Não tem segredo nenhum, coloque essa anotation sobre o objeto da classe, por exemplo
Para fazer a consulta depois, é só trazer os objetos Pessoas e usar o getCidade() para retornar a cidade correspondente da pessoa. (Se a consulta estiver fora do contexto da transação, ai será necessário você usar o atributo fetch=FetchType.EAGER).
W
Wakky
ManchesteR,
Obrigado, a minha duvida reside na pesquisa, pq eu tenho uma session (gerada automaticamente plo netbeans) que faz da a seguinte pesquisada:
publicList<Pessoa>findAll(){
returnem.createQuery("select object(o) from Pessoa as o").getResultList();}
e o msmo para Cidade… nesse caso como seria a pesquisa?
O que existe: Entity
@Entity@Table(name="Pessoa")@NamedQueries({@NamedQuery(name="Pessoa.findByIdPessoa",query="SELECT p FROM Pessoa p WHERE p.idPessoa = :idPessoa"),@NamedQuery(name="Pessoa.findByPessoa",query="SELECT p FROM Pessoa p WHERE p.pessoa = :pessoa"),@NamedQuery(name="Pessoa.findByIdCidadeFK",query="SELECT p FROM Pessoa p WHERE p.idCidadeFK = :idCidadeFK")})publicclassPessoaimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Id@Column(name="idPessoa",nullable=false)privateIntegeridPessoa;@Column(name="Pessoa")privateStringpessoa;@Column(name="idCidade_FK",nullable=false)privateintidCidadeFK;/***ADICIONADO A MAO*/@OneToMany(cascade={CascadeType.ALL}privateCidadecidade;publicCidadegetCidade(){returncidade;}publicvoidsetCidade(Cidadecidade){this.cidade=cidade;}/***FIM ADICIONADO A MAO*/publicPessoa(){}publicPessoa(IntegeridPessoa){this.idPessoa=idPessoa;}publicPessoa(IntegeridPessoa,intidCidadeFK){this.idPessoa=idPessoa;this.idCidadeFK=idCidadeFK;}publicIntegergetIdPessoa(){returnidPessoa;}publicvoidsetIdPessoa(IntegeridPessoa){this.idPessoa=idPessoa;}publicStringgetPessoa(){returnpessoa;}publicvoidsetPessoa(Stringpessoa){this.pessoa=pessoa;}publicintgetIdCidadeFK(){returnidCidadeFK;}publicvoidsetIdCidadeFK(intidCidadeFK){this.idCidadeFK=idCidadeFK;}@OverridepublicinthashCode(){inthash=0;hash+=(idPessoa!=null?idPessoa.hashCode():0);returnhash;}@Overridepublicbooleanequals(Objectobject){// TODO: Warning - this method won't work in the case the id fields are not setif(!(objectinstanceofPessoa)){returnfalse;}Pessoaother=(Pessoa)object;if((this.idPessoa==null&&other.idPessoa!=null)||(this.idPessoa!=null&&!this.idPessoa.equals(other.idPessoa))){returnfalse;}returntrue;}@OverridepublicStringtoString(){return"entity.Pessoa[idPessoa="+idPessoa+"]";}}
…a Session:
@StatelesspublicclassPessoaFacadeimplementsPessoaFacadeLocal{@PersistenceContextprivateEntityManagerem;publicvoidcreate(Pessoapessoa){em.persist(pessoa);}publicvoidedit(Pessoapessoa){em.merge(pessoa);}publicvoidremove(Pessoapessoa){em.remove(em.merge(pessoa));}publicPessoafind(Objectid){returnem.find(entity.Pessoa.class,id);}publicList<Pessoa>findAll(){returnem.createQuery("select object(o) from Pessoa as o").getResultList();}}
[]'s
Wakky
J
Jair_Rillo_Junior
Primeiro de tudo,
Esquece esses Wizards (seja de Netbeans, Eclipse, Plugin e etc), entenda primeiro como a JPA funciona.
Segundo, esqueça esse idCidadeFK, você não precisa declarar ela… Quando você usa private Cidade cidade, ele já vai usar um campo chamado cidade_id dentro da tabela de Pessoa.
No caso do método criado pelo netbeans, você pode alterá-lo e inserior um JOIN FETCH ai, algo do tipo
returnem.createQuery("select object(o) from Pessoa o JOIN FETCH o.cidade").getResultList();
W
Wakky
Ya cara… eu sei… tou me desligando desses wizards em tudo…
Vou testar agora.
E no caso de OneToOne é da mesma maneira?
[]'s
Wakky
J
Jair_Rillo_Junior
Wakky:
Ya cara… eu sei… tou me desligando desses wizards em tudo…
Vou testar agora.
E no caso de OneToOne é da mesma maneira?
[]'s
Wakky
Cara, o que eu falei era para o OneToOne, foi mal
O OneToMany dá para fazer de duas formas… unidirecional e bidirecional. O unidirecional você precisa de uma tabela auxiliar, enquanto o bidirecional não.
Para usar o Unidirecional você só usa o @OneToMany conforme dito, porém tem que criar uma tabela PESSOA_CIDADE. Agora se for utilizar bidreicional, você deve usar o mappedBy no @OneToMany e também usar o @ManyToOne na classe Cidade.
o @OneToOne é o mais simples, conforme eu já expliquei.
Parece confuso, mas não é não… tire um tempo para estudá-lo. Tem um PDF Free (Mastering Enterprise JavaBeans 3.0 4th Edition - procure no google que você acha para download). Ele tem uma sessão de JPA interessante.
Caso queria um livro, eu indico o Pro EJB 3 Java Persistence API.
Você estudou o OneToMany e ManyToOne? qual tecnica voc6e vai usar, unidirecional ou bidirecional?
Esse erro provavelmente é porque a JPA não achou a coluna com o nome que ela precisa.
Mostra suas classes e estruturas das suas tabelas.
W
Wakky
eu botei ele para mostrar na consola e não estou intendendo o seguinte:
ele mostra os campos todos de pessoa mais este: t0.CIDADE_idCidade, e depois começa com os da Cidade.
Depois pega a exception:
Internal Exception: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column 't0.CIDADE_idCidade' in 'field list'
W
Wakky
se os campos tiverem nomes diferentes?? idCidade numa e idCidades na outra?? influencia?
J
Jair_Rillo_Junior
Como eu disse meu amigo, a nomenclatura utilizada por você está diferente dos padrões que o JPA trabalha, ou alguma coluna/tabela está faltando.
E digo novamente, estude a parte de relacionamento e decida qual o melhor para você (unidirecional ou bidirecional), porque cada um usa estratégias diferentes.
W
Wakky
vou voltar a dar uma vista entao…
valeu a ajuda
[]'s
Wakky
V
vitenho
ola Jair
veja se pode me ajudar
a query :
SelectpfromManySideApjoinfetchp.ManySideB
ok isso funciona
mas vai q eu tenho 100 000 ManySideB!!!
eu soh preciso dos ManySideB pra não haver L I EXCEptions…
estou numa many to many onde vou adicionando as collections das entities nas suas correspondentes
poderia me dizer como faço pra adicionar as collections qndo uso ManyToMany???