Many to Many com dados compartilhados

7 respostas
V

Tenho um modelo mais ou menos parecido com este. Minha dúvida é a seguinte:
Preciso fazer uma entidade intermediária(AlunoTrabalho) no meu modelo UML? Pois fazendo isto, meu modelo vai ficar com uma coleção de AlunoTrabalho de cada lado. Se não fizer assim, fico na dúvida de onde vai meu atributo eLider, já que é um atributo do relacionamento.

Seguem figuras.



7 Respostas

V

Também tenho uma dúvida bem parecida. Só que no meu caso, é pra .Net (nhibernate + fluent).
Tenho uma lista de cursos e cada curso tem suas disciplinas.
Aí entra um professor na parada. Ele tem permissão para ALGUNS cursos e ALGUMAS disciplinas daquele curso.
Não há como mapear o curso e a disciplina pro professor sem criar uma terceira entidade CursoDisciplina…
Alguém poderia dar uma luz?

davidbuzatto

Qual o problema de ter uma coleção de cada lado?

Em UML vc pode criar a classe do meio e relacionar as outras duas, ou então utilizar uma classe de associação (classe associativa, association class), que serve justamente para isso. Sugiro usar a classe de associação por causa da semântica que a representação dela tem no diagrama.

Dê uma olhada aqui: http://www.ibm.com/developerworks/rational/library/content/RationalEdge/sep04/bell/
Do meio do artigo para o final, tem uma seção explicando as classes de associação.

[]´s

V

Obrigado pela resposta David!

Então. O que eu to querendo evitar é justamente esta classe de associação.
Eu queria poder fazer isso:

Professor p = new Professor();
p.Nome = "Verminoso";

Curso c = new Curso();
c.AddDisciplina(new Disciplina(){Nome = "Aritimética"});
c.AddDisciplina(new Disciplina(){Nome = "Geometria"});

p.AddCursos(c);

_session.SaveOrUpdate(p);

Com este trecho de código, gostaria que gravasse nas tabelas:
tbl_Professor (ID, NOME)
tbl_ProfessorCursoDisciplina(ID_PROFESSOR, ID_CURSO, ID_DISCIPLINA)

Considerando que eu já tenha as seguintes tabelas
tbl_Curso(ID, NOME)
tbl_Disciplina(ID, NOME)
tbl_CursoDisciplina(ID_CURSO, ID_DISCIPLINA)

Sem criar uma classe de associação, não consigo fazer, pois no mapeamento do professor consigo apenas referenciar o Curso. Gostaria de referênciar também a disciplina.
Se eu criar uma classe de associação, o meu código não ficaria “fluente” da forma que eu mostrei.

Tá complicado… :?

davidbuzatto

Pela natureza do relacionamento, o correto é ter a classe associativa.
Tanto é que sem ela você não está conseguindo resolver o problema :slight_smile:

Um professor pode dar aula em diversas disciplinas, e uma disciplina pode ser lecionada por diversos professores.
A não ser que você fique replicando um dos lados do relacionamento (criando assim um 1xN, o que é gambiarra das grandes no seu caso), você não vai conseguir modelar suas classes sem uma entidade que faça a ligação entre as duas outras.

Se estiver usando o Hibernate ou qq outra implementação da JPA e caso sua classe associativa não tenha nenhum atributo além da ligação entre as outras duas classes, você não precisa implementar ela, bastando anotar os dois lados com o ManyToMany e definindo o lado forte da relação (aquele que não usa o mappedBy). Caso tenha algum atributo, você vai precisar implementar a classe associativa.

[]´s

V

Então, no meu caso seria este. Mas usando o Fluent + nHibernate, ao mapear esta relação (curso x disciplinas) para o professor (na tabela tbl_ProfessorCursoDisciplina), ele gera um erro, dizendo a FK tbl_ProfessorCursoDisciplina é ID_CURSO e ID_DISCIPLINA e a pk do outro lado é só ID_CURSO… Ele reclama que a tabela curso não tem ID_DISCIPLINA.
Não sei se eu estou conseguindo explicar, mas neste caso, a classe associativa teria apenas uma entidade curso e uma disciplina dentro dela apenas pra relacionar com o professor. Acho isso estranho. Talvez se mapear com xml eu consiga.
Se possível, mostre como ficaria mais ou menos esse mapeamento (do professor, curso e disciplinas) em xml…

Valeu David.

V

Acho que agora eu entendi o que você quis dizer.

Pro meu mapeamento Curso x Disciplina, no meu caso não preciso de uma terceira entidade.
Pra mapear Cursos x Disciplinas para Professores, aí eu preciso da CursoDisciplina, Certo?

davidbuzatto

Verminose Scrum:
Acho que agora eu entendi o que você quis dizer.

Pro meu mapeamento Curso x Disciplina, no meu caso não preciso de uma terceira entidade.
Pra mapear Cursos x Disciplinas para Professores, aí eu preciso da CursoDisciplina, Certo?

Isso :wink:

Criado 5 de outubro de 2010
Ultima resposta 5 de out. de 2010
Respostas 7
Participantes 3