Relacionamento

Fala galera tudo na paz. A minha dúvida e a mesma de sempre sobre mapeamento e relacionamento entre classes, eu peguei um exemplo postado lá do fórum do javafree, mais que eu não conseguir compreender muito bem.
A situação seria assim um cliente pode alugar vários filmes e um filme pode ser alugado por mais de um cliente.

Classe Cliente:

import java.util.Set;

/*
 * Created on 24/07/2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author foguinho
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class Cliente {
	 private int id;
	 private String nome;
	 private Set alugar; // Um cliente pode fazer vários aluguéis!
	 
	 public Cliente() {
	   	
	 }
	
	// Sets e gets dos atributos
	/**
	 * @return Returns the id.
	 */
	public int getId() {
		return id;
	}
	/**
	 * @param id The id to set.
	 */
	public void setId(int id) {
		this.id = id;
	}
	/**
	 * @return Returns the nome.
	 */
	public String getNome() {
		return nome;
	}
	/**
	 * @param nome The nome to set.
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public void addAluguel(Alugar a) {
	    alugar.add(a);
	}
}

Classe Filme:

import java.util.Set;

/*
 * Created on 24/07/2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author foguinho
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class Filme {
	private int id;
	private String nome;
	private String genero;
	private Set alugar; // Um filme pode ser alugado várias vezes
	
	public Filme() {
	
	}
	
	// Sets e gets dos atributos
	/**
	 * @return Returns the genero.
	 */
	public String getGenero() {
		return genero;
	}
	/**
	 * @param genero The genero to set.
	 */
	public void setGenero(String genero) {
		this.genero = genero;
	}
	/**
	 * @return Returns the id.
	 */
	public int getId() {
		return id;
	}
	/**
	 * @param id The id to set.
	 */
	public void setId(int id) {
		this.id = id;
	}
	/**
	 * @return Returns the nome.
	 */
	public String getNome() {
		return nome;
	}
	/**
	 * @param nome The nome to set.
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public void addAluguel(Alugar a) {
	    alugar.add(a);
	}
}

Classe Alugar:

/**
 * @author foguinho
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class Alugar {
	 private int clienteId;
	 private int filmeId;
	
	 public Alugar() { 
	   	
	 }

	 // Sets e gets dos atributos
	 //public Set getCliente() {
	 	
		
	 //}
	 
	 public void setCliente(Cliente cli) {
	      this.clienteId = cli.getId();
	      cli.addAluguel(this);
	 }

	
	 //public Set getFilme() {
	 	
		
	 //}
	 public void setFilme(Filme fil) {
	      this.filmeId = fil.getId();
	      fil.addAluguel(this);
	 }

}

Na classe Alugar como seria o método getCliente() é o método getFilme(), então é isso aí galera desde de já agradeço pela paciência e pela atenção e espero que vocês possam me ajudar nessa dúvida cruel sobre relacionamento. Ah se der pra fazer um exemplozinho inserindo e recuperando dados da classe filme e cliente eu ficaria muito agradecido.

Amigo littlefire é semanticamente ruim colocar uma classe com nome de verbo. Pode alterá-la para “aluguel”.

Imagino que seja o seguinte: um cliente pode ter vários “alugueis”. E um filme pode ter sido alugado por vários clientes.

O que acontece: se você não precisa de mais nenhuma informação sobre o relacionamento entre cliente e filme, a classe aluguel seria desnecessária, você pode linkar cliente diretamente a filme. Porém, creio que você queira por exemplo colocar data do aluguel. Aí, a classe aluguel seria uma classe de associação entre cliente e filme.

Se está pensando no hibernate, o caso é de composite element:

http://www.hibernate.org/hib_docs/v3/reference/en/html/components.html#components-incollections

Abraços!

valeu aí rodrigoy pelas dicas e a classe Alugar teria a data do aluguel mesmo, mais eu não estou usando o hibernate, aí eu queria saber como ficaria os métodos getCliente() é o getFilme() da classe Alugar.

Você não precisaria dos ids… você pode usar as próprias classes. Quem vai guardar o ID é o banco, não a sua classe.

Então rodrigoy a classe Aluguel ficaria assim, se eu tive errado me corrija.

Classe Aluguel:

import java.sql.Date;


/*
 * Created on 24/07/2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author foguinho
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class Aluguel {
	 private Date data;
	 private Cliente cliente;
	 private Filme filme;
	
	 public Aluguel() { 
	   	
	 }
	 // Sets e gets dos atributos
	/**
	* @return Returns the data.
	*/
	public Date getData() {
		return data;
	}
	/**
	* @param data The data to set.
	*/
	public void setData(Date data) {
		this.data = data;
	}
	 
	 public Cliente getCliente() {
	 	
		return cliente;
	 }
	 
	 public void setCliente(Cliente cliente) {
	      this.cliente = cliente;
	      cliente.addAluguel(this);
	 }

	
	 public Filme getFilme() {
	 	
		return filme;
	 }
	 public void setFilme(Filme filme) {
	      this.filme= filme;
	      filme.addAluguel(this);
	 }

	
}

Se não for muita enchessão de saco dava pra fazer um exemplozinho de como cadastrar e acessar os dados de cliente e filme.

Aí vai de como a sua interação ocorre. Imagino que vc tenha uma tela aonde a associação entre Cliente e Filme ocorre. Então, seu caso de uso seria assim:

  • O Ator inicia o caso de uso;
  • O Sistema solicita o cpf do cliente;
  • O Ator informa o cpf;
  • O Sistema exibe os dados do cliente e solicita o id do filme para locação;
  • O Ator informa o id do filme;
  • O Sistema inclue o filme e volta ao passo anterior por quantas vezes o ator desejar;
  • O Ator finaliza a inclusão de filmes;
  • O Sistema finaliza as locações e o caso de uso encerra;

É isso que vc imagina? Se sim, note que na verdade uma locação pode ter vários filmes, se isso for importante sua classe aluguel deverá ser uma composição de “AluguelItem”. Seu façade ficaria mais ou menos com as seguintes operações:

public Cliente buscarCliente(String cpf) { implementação buscando no repository}

public void salvarAluguel(String cpf, Collection filmes) { implementação criando um Aluguel }

OK?

Valeu aí velho pelas dicas.