Fórum Relacionamento Many-To-Many JPA #415730
22/04/2012
0
A situação é a seguinte:
Tenho uma Classe Contato e uma Classe Usuario.
A classe Contato pode ter um ou vários usuários, e a classe Usuario
pode ter um ou vários Contatos.
Na tabela que faz relacionamento entre essas duas classes citadas acima,
eu gostaria de incluir 3 campos: E-mail, Telefone e Grupo; grupo seria outra classe
e que iria entrar nesse relacionamento para o usuário setar o grupo que o contato
pertence.
Desde já agradeço
Felipe Ramalho
Curtir tópico
+ 0Posts
23/04/2012
Davi Costa
E terá dois ManyToOne. Pela minha experiência com o Hibernate, isso não vai ficar automatizado, vc sempre terá que cadastrar um pai, para depois passar o atributo para a tabela de meio de campo e inserir a tabela de meio de campo.
Att Davi
Gostei + 0
23/04/2012
Felipe Ramalho
E terá dois ManyToOne. Pela minha experiência com o Hibernate, isso não vai ficar automatizado, vc sempre terá que cadastrar um pai, para depois passar o atributo para a tabela de meio de campo e inserir a tabela de meio de campo.
Att Davi
Davi eu não tou conseguindo de jeito nenhum, ele tá gerando as tabelas no banco do jeito que eu quero.
Adiciona Contato, Adiciona Usuario, mas quando vai adicionar o UsuarioContato (tabela de relacionamento)
ele não da erro mas não aparece nenhum registro na tabela. Estou enviando o codigo das classes pra vc ver.
Classe Contato
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication3;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import javax.persistence.*;
/**
*
* @author Felipe
*/
// @JoinColumns({@JoinColumn(name=idUsuario), @JoinColumn(name=idContato)})
@Entity
@Table
public class Contato implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = idContato)
private Integer id;
@Column(name = nome)
private String nome;
@OneToMany(cascade= CascadeType.ALL, fetch= FetchType.LAZY)
@JoinColumn(name=idContato)
private List<UsuarioContato> usuarioContato = new LinkedList<>();
public Contato() {
}
public Contato(String nome) {
this.nome = nome;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public List<UsuarioContato> getUsuarioContato() {
return usuarioContato;
}
public void setUsuarioContato(List<UsuarioContato> usuarioContato) {
this.usuarioContato = usuarioContato;
}
public void add(UsuarioContato usuarioContato){
getUsuarioContato().add(usuarioContato);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Contato other = (Contato) obj;
if (!Objects.equals(this.id, other.id)) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 5;
hash = 67 * hash + Objects.hashCode(this.id);
return hash;
}
}
Classe usuario
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication3;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import javax.persistence.*;
/**
*
* @author Felipe
*/
// @JoinColumns({@JoinColumn(name=idUsuario), @JoinColumn(name=idContato)})
@Entity
@Table
public class Usuario implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name=idUsuario)
private Integer idUsuario;
private String nome;
@OneToMany(cascade= CascadeType.ALL, fetch= FetchType.LAZY)
@JoinColumn(name=idUsuario)
private List<UsuarioContato> usuarioContato = new LinkedList<>();
public Usuario(String nome) {
this.nome = nome;
}
public Usuario() {
}
public void addContato(Contato contato){
UsuarioContato uc = new UsuarioContato();
UsuarioContatoPK ucPK = new UsuarioContatoPK();
ucPK.setContato(contato);
ucPK.setUsuario(this);
uc.setChaveComposta(ucPK);
this.getUsuarioContato().add(uc);
contato.getUsuarioContato().add(uc);
}
public Integer getIdUsuario() {
return idUsuario;
}
public void setIdUsuario(Integer idUsuario) {
this.idUsuario = idUsuario;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public List<UsuarioContato> getUsuarioContato() {
return usuarioContato;
}
public void setUsuarioContato(List<UsuarioContato> usuarioContato) {
this.usuarioContato = usuarioContato;
}
public void addUsuarioContato(Contato contato){
UsuarioContato uc = new UsuarioContato();
uc.getChaveComposta().setContato(contato);
uc.getChaveComposta().setUsuario(this);
contato.add(uc);
getUsuarioContato().add(uc);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Usuario other = (Usuario) obj;
if (!Objects.equals(this.idUsuario, other.idUsuario)) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 7;
hash = 23 * hash + Objects.hashCode(this.idUsuario);
return hash;
}
}
Classe UsuarioContato
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication3;
import java.io.Serializable;
import java.util.Objects;
import javax.persistence.*;
/**
*
* @author Felipe
*/
@Entity
@Table(name = usuario_contato)
@AssociationOverrides({
@AssociationOverride(name = idUsuario, joinColumns =
@JoinColumn(name = idUsuario)),
@AssociationOverride(name = idContato, joinColumns =
@JoinColumn(name = idContato))})
public class UsuarioContato implements Serializable {
@EmbeddedId
private UsuarioContatoPK chaveComposta = new UsuarioContatoPK();
@Column(nullable = true)
private String email;
@Column(nullable = true)
private String telefone;
public UsuarioContatoPK getChaveComposta() {
return chaveComposta;
}
public void setChaveComposta(UsuarioContatoPK chaveComposta) {
this.chaveComposta = chaveComposta;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTelefone() {
return telefone;
}
public void setTelefone(String telefone) {
this.telefone = telefone;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final UsuarioContato other = (UsuarioContato) obj;
if (!Objects.equals(this.chaveComposta, other.chaveComposta)) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 5;
hash = 67 * hash + Objects.hashCode(this.chaveComposta);
return hash;
}
}
Classe UsuarioContatoPK
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication3;
import java.io.Serializable;
import java.util.Objects;
import javax.persistence.*;
/**
*
* @author Felipe
*/
@Embeddable
@Table(name=usuario_contato)
public class UsuarioContatoPK implements Serializable {
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name=idUsuario, nullable=true)
private Usuario usuario;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name=idContato, nullable=true)
private Contato contato;
public Contato getContato() {
return contato;
}
public void setContato(Contato contato) {
this.contato = contato;
}
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final UsuarioContatoPK other = (UsuarioContatoPK) obj;
if (!Objects.equals(this.usuario, other.usuario)) {
return false;
}
if (!Objects.equals(this.contato, other.contato)) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 5;
hash = 89 * hash + Objects.hashCode(this.usuario);
hash = 89 * hash + Objects.hashCode(this.contato);
return hash;
}
}
Main (Teste)
Usuario usuario = new Usuario();
Contato contato = new Contato();
EntityManagerFactory emf = Persistence.createEntityManagerFactory(JavaApplication3PU);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// em.persist(usuario);
// em.persist(contato);
// em.getTransaction().commit();
Usuario u1 = new Usuario();
Contato c1 = new Contato();
u1 = em.find(Usuario.class, 1);
c1 = em.find(Contato.class, 32768);
usuario.addContato(contato);
em.merge(u1);
em.getTransaction().commit();
em.close();
}
No Main eu primeiro adicionei um contato e um usuario
Depois recuperei o usuario e contato e adicionei o relacionamento,
já fiz tudo no método addContato na Classe Usuário.
Gostei + 0
23/04/2012
Davi Costa
É o que eu te falei antes, o hibernate não vai ser inteligente o bastante para vc só setando na classe usuário ou contato, vai ter que tratar UsuarioContato como se fosse uma classe qualquer. dando seus inserts e selects.
Faz esse teste.
att Davi
Gostei + 0
23/04/2012
Felipe Ramalho
É o que eu te falei antes, o hibernate não vai ser inteligente o bastante para vc só setando na classe usuário ou contato, vai ter que tratar UsuarioContato como se fosse uma classe qualquer. dando seus inserts e selects.
Faz esse teste.
att Davi
Davi eu fiz o seguinte teste...
Pow Davi, vc salvou meu dia kkkkkk
eh isso mesmo cara. Aproveitando pra ajudar a galera ai que tiver duvida tbm.
O codigo para salvar
UsuarioContato uc = new UsuarioContato();
u1 = em.find(Usuario.class, 1);
c1 = em.find(Contato.class, 32768);
uc.getChaveComposta().setContato(contato);
uc.getChaveComposta().setUsuario(usuario);
em.persist(uc);
E o código para recuperar o objeto pelo o usuario.
c1 = em.find(Contato.class, 32768);
//Carregamento tipo LAZY
u1.getUsuarioContato();
exibindo
for (UsuarioContato uc1 : u1.getUsuarioContato()) {
System.out.println(uc1.getEmail());
System.out.println(uc1.getChaveComposta().getContato().getNome());
}
Nem tou acreditando que ta pegando.
Vlw ai galera
Abraços
Gostei + 0
23/04/2012
Davi Costa
Muito bom vc postar sua solução.
Att Davi
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)