Um grupo me pediu ajuda com anotações em relacionamentos e como eu quis
adiantar logo o lado deles, escrevi um longo e-mail explicando como fazer.
Como achei que a dúvida deles poderia ser a de outros, aqui segue um trecho:
)...) uma breve explicação sobre as anotações:
São 4: @OneToOne, @ManyToOne, @OneToMany, @ManyToMany.
Então elas servem para anotar referências de um objeto para outro, ou seja,
relacionamentos.
Um relacionamento pode ser unidirecional (se A aponta para B mas B não
aponta para A) ou bi-direcional (A aponta para B e B aponta para A).
Exemplos:
class Pessoa {
String nome;
Usuario usuario;
}
class Usuario {
String login;
String senha;
}
O exemplo acima é um relacionamento unidirecional de Pessoa para Usuario, já
que Usuario não referencia Pessoa de volta.
class Turma {
Collection<Aluno> alunosInscritos;
}
class Aluno {
Collection<Turma> inscricoes;
Collection<Turma> turmasCursadas;
}
O exemplo acima tem DOIS relacionamentos. Um bi-direcional entre o aluno e
as turmas em que se inscreveu (quando um aluno se inscreve numa turma ele
aparece na coleção de alunos inscritos e a turma aparece na coleção de
inscrições daquele aluno) e OUTRO unidirecional que lista quais turmas o
aluno cursou.
Ok, sabendo isto, temos que descobrir quais anotações vão em quais
relacionamentos. E é razoavelmente simples:
Olhe para o atributo que você vai anotar. Ele é uma coleção? Se for, é
@XXXToMany. Se for uma referência para uma instância apenas, é @XXXToOne. Ou
seja, aquele atributo aponta "ToMany" (para muitos, se for uma coleção) ou
"toOne"
(para um, se for uma instância só).
Para descobrir o XXX, é simples. O seu relacionamento, como falei, pode ser
unidirecional ou bi-direcional. Vamos supor que seja bidirecional (se for
unidirecional, imagine como seria a referência da outra classe se ele fosse
bi-direcional).
Então vamos olhar lá. Se for uma coleção, XXX = Many. Se for uma referência
simples, XXX é One.
Logo você vai notar que sempre que um for OneToOne ou ManyToMany, o
correspondente na outra classe também será. Sempre que for OneToMany, o
correspondente será ManyToOne e vice-versa.
Por fim, falta apenas explicar UM detalhe sobre os relacionamentos
bi-direcionais.
Sempre que vc fizer um bi-direcional, sua anotação precisará de um atributo
mappedBy desta forma:
class Turma {
@ManyToMany(mappedBy="incricoes")
Collection<Aluno> alunosInscritos;
}
Daqui preciso explicar de onde eu tirei o valor "inscricoes" e para que
serve este mappedBy.
O mappedBy informa que os dois atributos, nas duas classes, estão ligados,
ou seja, que são UM MESMO RELACIONAMENTO BI-DIRECIONAL.
Para ligar os dois atributos, eu escolho APENAS UM DELES, coloco este
atributo e digo qual o nome do outro, ou seja, do atributo na outra classe.
Isto só é necessário nos bi-direcionais. Nos unidirecionais não faz sentido,
já que você só tem um atributo para anotar e não tem o nome do outro para
informar.
O impacto disso é o seguinte:
1. Suponha que eu anotei Turma da forma como coloquei no exemplo.
2. Se eu adicionar um Aluno na coleção, automaticamente aquela turma vai
aparecer na coleção "inscricoes" do Aluno adicionado.
3. Se eu adicionar uma Turma na colecao "inscricoes" do Aluno, NÃO É
GARANTIDO que aquele Aluno aparecerá na coleção "alunosInscritos" em turma.
4. Há impactos também em como o banco de dados será construído, mas não é
necessário que vocês detenham este conhecimento em comp 2 já que depende de
conhecimentos mais aprofundados de bancos de dados.
Onde eu disse Collection serve também para as interfaces List, Set e
coleções concretas como ArrayList e TreeSet e outras.
Abraço a todos.
Peter P. Lupo
http://craftnicely.blogspot.com - http://sites.google.com/site/pplupo
<http://sites.google.com/site/pplupo>MPS.BR Authorized Implementation
Practitioner<http://www.softex.br/mpsbr/_profissionais/MPS.BR_certificados_de_arovacao_prova_P2-MPS.BR.pdf>-
Certified
ScrumMaster <http://www.scrumalliance.org/pages/certified_scrummaster>
<http://www.scrumalliance.org/pages/certified_scrummaster>Sun Certified
Java Associate <http://www.sun.com/training/certification/java/scja.xml> - Java
Black Belt <http://www.blackbeltfactory.com/ui#!User/pplupo>
<http://www.blackbeltfactory.com/ui#!User/pplupo>+55 (021) 81742487
--
You received this message because you are subscribed to the Google Groups "Comp
2 - Geral" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/comp2-geral?hl=en.