Bom dia pessoal!
Gostaria de tirar uma dúvida que venho tendo a tempos… qual a vantagem de se usar relacionamento ManyToMany ao invés de ManyToOne ?
Vou dar um exemplo prático:
Suponhamos a relação Pessoa x Endereço.
ManyToOne
/**
*
* @author jean
*/
@Entity
public class Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "nome")
private String nome;
@Column(name = "cpf")
private String cpf;
@Column(name = "idade")
private Integer idade;
@Column(name = "sexo")
private String sexo;
//Get e set, hascode e equals, toString
}
/**
*
* @author jean
*/
@Entity
public class Endereco implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "logradouro")
private String logradouro;
@Column(name = "numero")
private String numero;
@Column(name = "bairro")
private String bairro;
@ManyToOne
@JoinColumn(name = "pessoa")
private Pessoa pessoa;
//Get e set, hascode e equals, toString
}
Na hora de inserir no banco:
for (Endereco endereco : listaEnderecos) {
endereco.setPessoa(pessoa);
enderecoJpa.create(endereco);
}
Para recuperar:
Os endereços terão o código da pessoa e na hora de fazer a busca, basta fazer um find na tabela endereco where pessoa = pessoaDesejada.
Se quiser saber as pessoas de um determinado endereco basta selecionar endereco.pessoa where endereco = (parametros).
ManyToMany
/**
*
* @author jean
*/
@Entity
public class Pessoa implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long codigo_pessoa;
@Column(name = "nome")
private String nome;
@Column(name = "cpf")
private String cpf;
@Column(name = "idade")
private Integer idade;
@Column(name = "sexo")
private String sexo;
@ManyToMany
@JoinTable(name = "pessoaendereco", joinColumns = {
@JoinColumn(name = "codigo_pessoa")},
inverseJoinColumns = {
@JoinColumn(name = "codigo_endereco")})
@Cascade({org.hibernate.annotations.CascadeType.ALL})
private Collection<Endereco> enderecos;
//Get e set, hascode e equals, toString
}
/**
*
* @author jean
*/
@Entity
public class Endereco implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long codigo_endereco;
@Column(name = "logradouro")
private String logradouro;
@Column(name = "numero")
private String numero;
@Column(name = "bairro")
private String bairro;
@ManyToMany
@JoinTable(name = "pessoaendereco", joinColumns = {
@JoinColumn(name = "codigo_endereco")},
inverseJoinColumns = {
@JoinColumn(name = "codigo_pessoa")})
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
private Collection<Pessoa> pessoas;
//Get e set, hascode e equals, toString
}
/**
*
* @author jean
*/
@Entity
public class PessoaEndereco implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@ManyToOne
@JoinColumn(name = "codigo_pessoa")
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
private Pessoa codigo_pessoa;
@Id
@ManyToOne
@JoinColumn(name = "codigo_endereco")
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
private Endereco codigo_endereco;
//Get e set
}
Na hora de inserir no banco:
pessoa.setEnderecos(listaEnderecos);
pessoaJpa.crete(pessoa);
Para recuperar:
pessoa.getEnderecos();
endereco.getPessoas();
Enfim
Vejo os 2 casos resolvendo meu problema e o ManyToMany me parece mais complicado por criar uma tabela a mais… pensando em um sistema grande, a quantidade de tabelas aumentaria consideravalmente. Porém é muito mais fácil de inserir e buscar os endereços da pessoa e vice versa. Quando se usa um e quando se usa o outro ? O que se ganha com um e o que se perde com o outro ?
E o mais importante: é uma má prática de programação aplicar o relacionamento ManyToOne em um caso como este ?
Obrigado!