GARANTIR DESCONTO

Fórum Relacionamento Many-To-Many JPA #415730

22/04/2012

0

Galera não estou conseguindo fazer um relacionamento JPA many-to-many com atributo.
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

Felipe Ramalho

Responder

Posts

23/04/2012

Davi Costa

Nesse caso a tabela que faz o meio de campo será tratada como uma tabela normal.
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
Responder

Gostei + 0

23/04/2012

Felipe Ramalho

Nesse caso a tabela que faz o meio de campo será tratada como uma tabela normal.
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.
Responder

Gostei + 0

23/04/2012

Davi Costa

Na verdade no main vc vai ter que cadstrar um UsuarioContato .
É 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
Responder

Gostei + 0

23/04/2012

Felipe Ramalho

Na verdade no main vc vai ter que cadstrar um UsuarioContato .
É 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
Responder

Gostei + 0

23/04/2012

Davi Costa

Beleza Felipe!
Muito bom vc postar sua solução.

Att Davi
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar