Spring + Hibernate Many-To-Many [RESOLVIDO]

4 respostas
dugbuddy

Olá Pessoal, estou com um problema de mapeamento… Hibernate Many-To-Many.
O cenário é o seguinte.
Eu tenho um cadastro de uma empresa…
A Empresa possui Perfil de Vaga, e uma das caracteristicas do Perfil de Vaga é o tipo de Contatos ( Funcionarios, Clientes e Fornecedores - pode ser 1 ou 3 tipos de contatos. )
EMPRESA 1 ----- * PERFIL DE VAGA * ---- * CONTATOS…

Contatos é uma tabela estática… como Cidade, Estado e Uf…

O relacionamento está até que certo… mas na hora de gravar que estou com problemas…

abaixo a servlet (EmpresaServlet.java)

GenericManager<Empresa, Long> empresaManager = (GenericManager<Empresa, Long>) context
				.getBean("empresaManager");
				
Empresa empresa = new Empresa;
empresa.setNome("Empresa X");

PerfilVaga perfilVaga = new PerfilVaga();
perfilVaga.setTipo("Vaga para Analista");

//perfilVaga.setContatos("?")
// Como pode ser 1 ou mais.. eu tenho que fazer um for..


GenericManager<Contatos, Long> contatosManager = (GenericManager<Contatos, Long>) context
				.getBean("contatosManager");

		String[] result = (request.getParameterValues("contatoPerfilVaga"));

		// For para adicionar uma lista de Long na Lista do Contato.
		for (int i = 0; i < result.length; i++) {
			Long x = Long.parseLong(result[i]);
			Contatos contatos = contatosManager.get(x); // recupero atraves do ID o tipo de contato do banco de Dados.
			Collection<Contatos> listaContatos = new ArrayList<Contatos>();
			listaContatos.add(contatos);
			perfilVaga.setContatos(listaContatos);

		}
		
perfilVaga.setEmpresa(empresa);

empresa.setPerfilVaga(new ArrayList<PerfilVaga>());
empresa.getPerfilVaga().add(perfilVaga);


try {
		empresaManager.save(empresa);
	
	} catch (Exception e) {
			request.setAttribute("erros", Collections.singletonList("Sistema indisponível"));
				e.printStackTrace();
			}

Quando faço isso… ex… eu marquei 2 opcoes … Func e Cliente…que sao os tipos de contato que o usuario vai ter.
Este codigo acima esta gravando somente o ultimo… o ID 2 que seria o Cliente…
O que estou fazendo de Errado ??

Muito Obrigado desde ja…

4 Respostas

dugbuddy

RELACIONAMENTOS…

Empresa.java

@Entity
@Table(name = "EMPRESA")
@SuppressWarnings("serial")
public class Empresa implements Serializable {

	/** Id da empresa */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "EMPRESA_ID")
	private Long id;

	@OneToMany(mappedBy = "empresa", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private Collection<PerfilVaga> perfilVaga;

        // Getters e Setters

PerfilVaga.java

@SuppressWarnings("serial")
@Entity
@Table(name = "PERFIL_VAGA")
public class PerfilVaga implements Serializable {

	/** id do perfil da vaga */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "PERFIL_VAGA_ID")
	private Long id;

	@ManyToMany(fetch=FetchType.LAZY)
	@JoinTable(name="PERFIL_VAGA_CONTATOS", joinColumns=@JoinColumn(name="PERFIL_VAGA_ID"), inverseJoinColumns=@JoinColumn(name="CONTATOS_ID"))
	private Collection<Contatos> contatos;

	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name = "EMPRESA_ID", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private Empresa empresa;

                // Getters e Setters

Contatos.java

@Entity
@Table (name = "CONTATOS")
@SuppressWarnings("serial")
public class Contatos implements Serializable{
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "CONTATOS_ID")
	private Long id;
	
	@ManyToMany(fetch=FetchType.LAZY)
	@JoinTable(name="PERFIL_VAGA_CONTATOS", joinColumns= @JoinColumn(name = "CONTATOS_ID"), 
	inverseJoinColumns=@JoinColumn(name = "PERFIL_VAGA_ID"))
	private Collection<PerfilVaga> perfilVaga;

        // Getters e Setters
F

A cada iteração do seu loop for, a listaContatos parece estar sendo sobrescrita
Verifique: perfilVaga.setContatos(listaContatos);

lucianotome

Tem que estar assim:

Collection<Contatos> listaContatos = new ArrayList<Contatos>(); for (int i = 0; i < result.length; i++) { Long x = Long.parseLong(result[i]); Contatos contatos = contatosManager.get(x); // recupero atraves do ID o tipo de contato do banco de Dados. listaContatos.add(contatos); } perfilVaga.setContatos(listaContatos);

dugbuddy

Luciano,

Funcionou !!

Muito Obrigado !!

Criado 15 de dezembro de 2009
Ultima resposta 15 de dez. de 2009
Respostas 4
Participantes 3