Você está na página 1de 4

Como implementar relacionamento muitos-para-muitos em Java

Um exemplo de relacionamento muitos-para-muitos é aquele que se estabelece entre as classes


Livro e Autor: um livro pode ser escrito por um ou muitos autores; um autor pode escrever um
ou muitos livros. O diagrama de classes abaixo ilustra a situação:

Para implementar relacionamentos desse tipo, muitos-para-muitos, em Java, …

1. Insira, em ambas as classes, um atributo do tipo coleção (Set, por exemplo);


2. Insira os métodos get e set correspondentes ao atributo coleção;
3. Insira métodos para adicionar e remover objetos na coleção

O detalhe importante é o seguinte: insira nos métodos adicionar e remover chamadas para os
métodos correspondentes da outra classe. Por exemplo: no método adicionarAutor, da classe
Livro, chame o método adicionarLivro da classe Autor. Já no método adicionarLivro da classe
Autor, chame o método adicionarAutor da classe Livro. Para evitar um loop infinito,
teste antes se o objeto já não foi incluído ou removido da coleção.

Vamos aos códigos…

Código da classe Livro

Observe os métodos adicionarAutor e removerAutor. Veja como eles invocam os métodos


correspondentes da classe Autor, adicionarLivro e removerLivro, respectivamente.

[source language='java']
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Livro {


private String titulo;
private Set autores;

public Livro() {
super();
this.autores = new HashSet();
}
public Livro(String titulo){
this.titulo = titulo;
this.autores = new HashSet();
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getTitulo() {
return titulo;
}
public void setAutores(Set autores) {
Iterator iterator = autores.iterator();
while (iterator.hasNext()){
Autor autor = (Autor)iterator.next();
this.adicionarAutor(autor);
}
}
public Set getAutores() {
return Collections.unmodifiableSet(this.autores);
}
public void adicionarAutor(Autor autor){
if (!this.getAutores().contains(autor)){
this.autores.add(autor);
autor.adicionarLivro(this);
}
}
public void removerAutor(Autor autor){
if (!this.getAutores().contains(autor)){
this.autores.remove(autor);
autor.removerLivro(this);
}
}
}
[/source]

Código da classe Autor

Mais uma vez, observe os métodos adicionarLivro e removerLivro. Veja como eles invocam os
métodos correspondentes da classe Livro, adicionarAutor e removerAutor, respectivamente.

[source language='java']
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Autor {


private String nome;
private Set livros;

public Autor() {
super();
this.livros = new HashSet ();
}
public Autor(String nome){
this.nome = nome;
this.livros = new HashSet ();
}

public void setNome(String nome) {


this.nome = nome;
}

public String getNome() {


return nome;
}

public void setLivros(Set livros) {


Iterator iterator = livros.iterator();
while (iterator.hasNext()){
Livro livro = (Livro)iterator.next();
this.adicionarLivro(livro);
}
}

public Set getLivros() {


return Collections.unmodifiableSet(this.livros);
}

public void adicionarLivro(Livro livro){


if (!this.getLivros().contains(livro)){
this.livros.add(livro);
livro.adicionarAutor(this);
}
}
public void removerLivro(Livro livro){
if (!this.getLivros().contains(livro)){
this.livros.remove(livro);
livro.removerAutor(this);
}
}
}
[/source]

Agora um aplicativo que demostra o uso das classes Livro e Autor:

[source language='java']
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class AppMuitosParaMuitos {

public static void main(String[] args) {


Livro livro01 = new Livro(“Livro 01″);
Livro livro02 = new Livro(“Livro 02″);
Set livros = new HashSet();
livros.add(livro01);
livros.add(livro02);

Autor autor01 = new Autor(“Autor 01″);


Autor autor02 = new Autor(“Autor 02″);

autor01.setLivros(livros);
autor02.setLivros(livros);

Livro livro03 = new Livro(“Livro 03″);


Livro livro04 = new Livro(“Livro 04″);

Autor autor03 = new Autor(“Autor 03″);


autor03.adicionarLivro(livro01);
autor03.adicionarLivro(livro03);
autor03.adicionarLivro(livro04);

System.out.println(“Autores do Livro 02:”);


Iterator iterator = livro02.getAutores().iterator();
while (iterator.hasNext()){
Autor autor = (Autor)iterator.next();
System.out.println(autor.getNome());
}
System.out.println(“==================”);
System.out.println(“Livros do Autor 03″);
iterator = autor03.getLivros().iterator();
while(iterator.hasNext()){
Livro livro = (Livro)iterator.next();
System.out.println(livro.getTitulo());
}
}
}
[/source]

É isso, pessoal.