Mapeamento Hibernate Many to Many para atualizar mais campos além das chaves

4 respostas
mailsonfp

Saudações galera.

Desculpem se abri tópico repetido, mas não achei nada que me ajudasse :/.

É o seguinte, tenho 2 tabelas Administradores e Empresas, e entre elas criei um relacionamento manytomany (administradoresempresas) no hibernate, porque no meu sistema um administrador pode ter várias empresas e uma empresa pode “pertencer” a vários administradores, montando uma rede administrativa para um sistema de investimentos.

Só que além das chaves, eu preciso de mais dois campos, que é responsavelEmpresa, que seria para guardar quem é o responsável direto pela empresa, que é o único que poderia montar a rede administrativa, e o outro campo que é a empresa principal, que é a empresa padrão para carregar as informações, e isso tem que ser por administrador logo tem que ser nesta tabela também.

O mapeamento manytomany está funcionando perfeitamente, mas queria gravar este terceiro campo, mas não consigo encontrar uma maneira, é meu projeto de TCC e o primeiro que estou desenvolvendo em Java, com Hibernate e JSF.

Alguém conhece uma maneira?

Obrigado galera.

4 Respostas

R

mailsonfp:
Saudações galera.

Desculpem se abri tópico repetido, mas não achei nada que me ajudasse :/.

É o seguinte, tenho 2 tabelas Administradores e Empresas, e entre elas criei um relacionamento manytomany (administradoresempresas) no hibernate, porque no meu sistema um administrador pode ter várias empresas e uma empresa pode “pertencer” a vários administradores, montando uma rede administrativa para um sistema de investimentos.

Só que além das chaves, eu preciso de mais dois campos, que é responsavelEmpresa, que seria para guardar quem é o responsável direto pela empresa, que é o único que poderia montar a rede administrativa, e o outro campo que é a empresa principal, que é a empresa padrão para carregar as informações, e isso tem que ser por administrador logo tem que ser nesta tabela também.

O mapeamento manytomany está funcionando perfeitamente, mas queria gravar este terceiro campo, mas não consigo encontrar uma maneira, é meu projeto de TCC e o primeiro que estou desenvolvendo em Java, com Hibernate e JSF.

Alguém conhece uma maneira?

Obrigado galera.

Eu criaria uma classe AdministradoresDaEmpresas…e mapearia nela o administrador, empresa, e os demais campos.

Na classe Administradores, uma lista para esta Classe e na Empresas tb um lista para ela…

O que acha?

mailsonfp

Eu pensei nisso também, se realmente não tive jeito vou fazer isso, mas tenho que estruturar certo, porque tenho que montar as telas para alteração dessas informações, estou pensando mas não consigo encontrar uma maneira boa para alterar depois.

Ainda tem que montar a tela para fazer a rede onde o responsável pela empresa localiza e adiciona os outros administradores a empresa, e outra onde ele escolhe qual é a empresa principal caso tenha mais de uma.

Se não tiver jeito mesmo vou fazer isso e tentar encontrar a melhor maneira para alterar depois, porque depois terei que me defender na banca, da clássica pergunta, “porque fez deste jeito e não daquele jeito” rsrs.

Obrigado qualquer coisa posto novas dúvidas!

mailsonfp

Eu criaria uma classe AdministradoresDaEmpresas…e mapearia nela o administrador, empresa, e os demais campos.

Na classe Administradores, uma lista para esta Classe e na Empresas tb um lista para ela…

O que acha?

Eu segui sua idéia.
Mas não consegui fazer funcionar, com o mapeamento o hibernate não grava mas também não dá nenhuma mensagem de erro, se eu retirar o mapeamento com AdministradoresEmpresas ele salva normalmente.

Eu fiz o mapeamento só na classe Empresas, porque a lógica do meu sistema é que o Administrador tem que estar logado para depois poder cadastrar a Empresa, então eu não pretendo carregar uma lista de administradoresempresas na classe Administrador embora o relacionamento seja muitos para muitos (aceito opiniões caso não seja usual, ou esteja errado meu jeito de pensar)

Vou postar meus códigos:

Classe Empresa

package investweb.empresas;

import investweb.administradoresempresas.AdministradoresEmpresas;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.NaturalId;

@Entity
@Table(name="empresas")
public class Empresa implements Serializable
{

	/**
	 * 
	 */
	private static final long serialVersionUID = -6950471521243119489L;
	
	@Id
	@GeneratedValue	
	private Integer idEmpresa;
	
	@NaturalId
	private String cnpj;
	private String nomeFantasia;
	private String razaoSocial;
	private String inscricaoEstadual;
	private String enderecoEmp;
	private String enderecoNumeroEmp;
	private String bairroEmp;
	private String cidadeEmp;
	private String cepEmp;
	private String ufEmp;
	private String telefoneContatoEmp;
	private float  aliquotaIR;
	
	@OneToMany(cascade = CascadeType.ALL, mappedBy="empresa")
	private List<AdministradoresEmpresas> redeAdministradores;
	
	public Integer getIdEmpresa()
	{
		return idEmpresa;
	}
	
	public void setIdEmpresa(Integer idEmpresa)
	{
		this.idEmpresa = idEmpresa;
	}
	
	public String getCnpj()
	{
		return cnpj;
	}
	
	public void setCnpj(String cnpj)
	{
		this.cnpj = cnpj;
	}
	
	public String getNomeFantasia()
	{
		return nomeFantasia;
	}
	
	public void setNomeFantasia(String nomeFantasia)
	{
		this.nomeFantasia = nomeFantasia;
	}
	
	public String getRazaoSocial()
	{
		return razaoSocial;
	}
	
	public void setRazaoSocial(String razaoSocial)
	{
		this.razaoSocial = razaoSocial;
	}
	
	public String getInscricaoEstadual()
	{
		return inscricaoEstadual;
	}
	
	public void setInscricaoEstadual(String inscricaoEstadual)
	{
		this.inscricaoEstadual = inscricaoEstadual;
	}
	
	public String getEnderecoEmp()
	{
		return enderecoEmp;
	}
	
	public void setEnderecoEmp(String enderecoEmp)
	{
		this.enderecoEmp = enderecoEmp;
	}
	
	public String getEnderecoNumeroEmp()
	{
		return enderecoNumeroEmp;
	}
	
	public void setEnderecoNumeroEmp(String enderecoNumeroEmp)
	{
		this.enderecoNumeroEmp = enderecoNumeroEmp;
	}
	
	public String getBairroEmp()
	{
		return bairroEmp;
	}
	
	public void setBairroEmp(String bairroEmp)
	{
		this.bairroEmp = bairroEmp;
	}
	
	public String getCidadeEmp()
	{
		return cidadeEmp;
	}
	
	public void setCidadeEmp(String cidadeEmp)
	{
		this.cidadeEmp = cidadeEmp;
	}
	
	public String getCepEmp()
	{
		return cepEmp;
	}
	
	public void setCepEmp(String cepEmp)
	{
		this.cepEmp = cepEmp;
	}
	
	public String getUfEmp()
	{
		return ufEmp;
	}
	
	public void setUfEmp(String ufEmp)
	{
		this.ufEmp = ufEmp;
	}
	
	public String getTelefoneContatoEmp()
	{
		return telefoneContatoEmp;
	}
	
	public void setTelefoneContatoEmp(String telefoneContatoEmp)
	{
		this.telefoneContatoEmp = telefoneContatoEmp;
	}
	
	public float getAliquotaIR()
	{
		return aliquotaIR;
	}
	
	public void setAliquotaIR(float aliquotaIR)
	{
		this.aliquotaIR = aliquotaIR;
	}

	public List<AdministradoresEmpresas> getRedeAdministradores()
	{
		return redeAdministradores;
	}

	public void setRedeAdministradores(List<AdministradoresEmpresas> redeAdministradores)
	{
		this.redeAdministradores = redeAdministradores;
	}

	@Override
	public int hashCode()
	{
		final int prime = 31;
		int result = 1;
		result = prime * result + Float.floatToIntBits(aliquotaIR);
		result = prime * result
				+ ((bairroEmp == null) ? 0 : bairroEmp.hashCode());
		result = prime * result + ((cepEmp == null) ? 0 : cepEmp.hashCode());
		result = prime * result
				+ ((cidadeEmp == null) ? 0 : cidadeEmp.hashCode());
		result = prime * result + ((cnpj == null) ? 0 : cnpj.hashCode());
		result = prime * result
				+ ((enderecoEmp == null) ? 0 : enderecoEmp.hashCode());
		result = prime
				* result
				+ ((enderecoNumeroEmp == null) ? 0 : enderecoNumeroEmp
						.hashCode());
		result = prime * result
				+ ((idEmpresa == null) ? 0 : idEmpresa.hashCode());
		result = prime
				* result
				+ ((inscricaoEstadual == null) ? 0 : inscricaoEstadual
						.hashCode());
		result = prime * result
				+ ((nomeFantasia == null) ? 0 : nomeFantasia.hashCode());
		result = prime * result
				+ ((razaoSocial == null) ? 0 : razaoSocial.hashCode());
		result = prime
				* result
				+ ((redeAdministradores == null) ? 0 : redeAdministradores
						.hashCode());
		result = prime
				* result
				+ ((telefoneContatoEmp == null) ? 0 : telefoneContatoEmp
						.hashCode());
		result = prime * result + ((ufEmp == null) ? 0 : ufEmp.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj)
	{
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Empresa other = (Empresa) obj;
		if (Float.floatToIntBits(aliquotaIR) != Float
				.floatToIntBits(other.aliquotaIR))
			return false;
		if (bairroEmp == null)
		{
			if (other.bairroEmp != null)
				return false;
		}
		else if (!bairroEmp.equals(other.bairroEmp))
			return false;
		if (cepEmp == null)
		{
			if (other.cepEmp != null)
				return false;
		}
		else if (!cepEmp.equals(other.cepEmp))
			return false;
		if (cidadeEmp == null)
		{
			if (other.cidadeEmp != null)
				return false;
		}
		else if (!cidadeEmp.equals(other.cidadeEmp))
			return false;
		if (cnpj == null)
		{
			if (other.cnpj != null)
				return false;
		}
		else if (!cnpj.equals(other.cnpj))
			return false;
		if (enderecoEmp == null)
		{
			if (other.enderecoEmp != null)
				return false;
		}
		else if (!enderecoEmp.equals(other.enderecoEmp))
			return false;
		if (enderecoNumeroEmp == null)
		{
			if (other.enderecoNumeroEmp != null)
				return false;
		}
		else if (!enderecoNumeroEmp.equals(other.enderecoNumeroEmp))
			return false;
		if (idEmpresa == null)
		{
			if (other.idEmpresa != null)
				return false;
		}
		else if (!idEmpresa.equals(other.idEmpresa))
			return false;
		if (inscricaoEstadual == null)
		{
			if (other.inscricaoEstadual != null)
				return false;
		}
		else if (!inscricaoEstadual.equals(other.inscricaoEstadual))
			return false;
		if (nomeFantasia == null)
		{
			if (other.nomeFantasia != null)
				return false;
		}
		else if (!nomeFantasia.equals(other.nomeFantasia))
			return false;
		if (razaoSocial == null)
		{
			if (other.razaoSocial != null)
				return false;
		}
		else if (!razaoSocial.equals(other.razaoSocial))
			return false;
		if (redeAdministradores == null)
		{
			if (other.redeAdministradores != null)
				return false;
		}
		else if (!redeAdministradores.equals(other.redeAdministradores))
			return false;
		if (telefoneContatoEmp == null)
		{
			if (other.telefoneContatoEmp != null)
				return false;
		}
		else if (!telefoneContatoEmp.equals(other.telefoneContatoEmp))
			return false;
		if (ufEmp == null)
		{
			if (other.ufEmp != null)
				return false;
		}
		else if (!ufEmp.equals(other.ufEmp))
			return false;
		return true;
	}	
}

Classe AdministradoresEmpresas

package investweb.administradoresempresas;

import investweb.administradores.Administrador;
import investweb.empresas.Empresa;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="administradoresempresas")
public class AdministradoresEmpresas implements Serializable
{

	/**
	 * 
	 */
	private static final long serialVersionUID = -891602918275900279L;
	
	@Id
	@GeneratedValue
	private Integer idAdministradorEmpresa;
	
	private boolean empresaPrincipal;
	private boolean responsavelEmpresa;
	
	@ManyToOne(optional=false)
	@JoinColumn(name="idAdministrador",referencedColumnName="idAdministrador")	
	private Administrador administrador;
	
	@ManyToOne(optional=false)
	@JoinColumn(name="idEmpresa",referencedColumnName="idEmpresa")
	private Empresa empresa;

	public Integer getIdAdministradorEmpresa()
	{
		return idAdministradorEmpresa;
	}

	public void setIdAdministradorEmpresa(Integer idAdministradorEmpresa)
	{
		this.idAdministradorEmpresa = idAdministradorEmpresa;
	}

	public boolean isEmpresaPrincipal()
	{
		return empresaPrincipal;
	}

	public void setEmpresaPrincipal(boolean empresaPrincipal)
	{
		this.empresaPrincipal = empresaPrincipal;
	}

	public boolean isResponsavelEmpresa()
	{
		return responsavelEmpresa;
	}

	public void setResponsavelEmpresa(boolean responsavelEmpresa)
	{
		this.responsavelEmpresa = responsavelEmpresa;
	}

	public Administrador getAdministrador()
	{
		return administrador;
	}

	public void setAdministrador(Administrador administrador)
	{
		this.administrador = administrador;
	}

	public Empresa getEmpresa()
	{
		return empresa;
	}

	public void setEmpresa(Empresa empresa)
	{
		this.empresa = empresa;
	}

	@Override
	public int hashCode()
	{
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((administrador == null) ? 0 : administrador.hashCode());
		result = prime * result + ((empresa == null) ? 0 : empresa.hashCode());
		result = prime * result + (empresaPrincipal ? 1231 : 1237);
		result = prime
				* result
				+ ((idAdministradorEmpresa == null) ? 0
						: idAdministradorEmpresa.hashCode());
		result = prime * result + (responsavelEmpresa ? 1231 : 1237);
		return result;
	}

	@Override
	public boolean equals(Object obj)
	{
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		AdministradoresEmpresas other = (AdministradoresEmpresas) obj;
		if (administrador == null)
		{
			if (other.administrador != null)
				return false;
		}
		else if (!administrador.equals(other.administrador))
			return false;
		if (empresa == null)
		{
			if (other.empresa != null)
				return false;
		}
		else if (!empresa.equals(other.empresa))
			return false;
		if (empresaPrincipal != other.empresaPrincipal)
			return false;
		if (idAdministradorEmpresa == null)
		{
			if (other.idAdministradorEmpresa != null)
				return false;
		}
		else if (!idAdministradorEmpresa.equals(other.idAdministradorEmpresa))
			return false;
		if (responsavelEmpresa != other.responsavelEmpresa)
			return false;
		return true;
	}	
}

Método salvar da Classe EmpresaDAOHibernate

@Override
	public void salvar(Empresa empresa) throws Exception
	{
		// TODO Auto-generated method stub
		try
		{
			this.session.beginTransaction();
			this.session.saveOrUpdate(empresa);
			this.session.getTransaction().commit();
		}
		catch (Exception e)
		{
			// TODO: handle exception
			this.session.getTransaction().rollback();
			throw new Exception();
		}
	}

Método salvar do ManagedBean da Empresa

public void salvar()
	{		
		try
		{
			EmpresaRN empresaRN = new EmpresaRN();
		
			ContextoBean contextoBean = ContextoUtil.getContextoBean();
			this.setAdministrador(contextoBean.getAdministradorLogado());						
			
			AdministradoresEmpresas administradoresEmpresas = new AdministradoresEmpresas();
			administradoresEmpresas.setAdministrador(administrador);
		
			if(empresa.getIdEmpresa()==0)
			{
				administradoresEmpresas.setEmpresaPrincipal(true);
				administradoresEmpresas.setResponsavelEmpresa(true);
			}
							
			this.empresa.getRedeAdministradores().add(administradoresEmpresas);
			
			empresaRN.salvar(empresa);
		}
		catch (Exception e)
		{
			// TODO: handle exception
			FacesContext context = FacesContext.getCurrentInstance();
			FacesMessage mensagem = new FacesMessage(FacesMessage.SEVERITY_ERROR,"Atenção",e.getMessage());
			context.addMessage(null,mensagem);
		}					
	}

Lembrando que se eu tirar o mapeamento funciona.
Desculpem se a pergunta for muito boba, é o primeiro projeto MEU mesmo que desenvolvo usando hibernate, eu não criei o DAO completo para a classe AdministradoresEmpresas, eu imagino que ao salvar a Empresa irá salvar os dados da outra tabela também. É isso mesmo?

O que fiz de errado?? :?:
Já tomei uma surra dessa parte, agradeço toda a ajuda possível.

Obrigado


mailsonfp

Obrigado a todos pela ajuda.

Consegui gravar os dados normalmente, acho que meu cérebro deu um "read of adrress’ de tanto que eu apanhei rs. Mas eu fiz o DAO normalmente para o AdministradoresEmpresas e nas regras de negócio da Empresa eu gravei os dados do AdministradoresEmpresas.

Agora tenho um novo problema, como fazer a HQL para selecionar as empresas de determinador administrador, por exemplo:

Eu fiz este teste, mas não deu certo hehe, como seria essa hql??

Obrigado pessoal!

Criado 12 de agosto de 2011
Ultima resposta 16 de ago. de 2011
Respostas 4
Participantes 2