Hibernate + Collection + @OneToMany + Struts 1.3.8

3 respostas
lgi2020

Amigos,

Estou estudando a utilização de Hibernate e Struts e esbarrei em algo que não faço idéia de como resolver.

Quero implementar o seguinte cenário:

  • aplicação simples no estilo de agenda de contatos;
  • cada contato pode ter nenhum ou muitos telefones;
  • cada telefone deve pertencer a um contato;
  • existem três tipos de telefones: RESIDENCIAL, CELULAR e COMERCIAL;
  • o formulário para o cadastro de um novo contato deve possuir os campos para cadastrar o(s) telefone(s);

Estou enfrentando o seguinte problema:
Tenho as classes para adição, alteração, exclusão e listagem através do Hibernate funcionando perfeitamente.
Se tento fazer o que quero com uma aplicação de console (j2se) tudo funciona normalmente.
Mas não faço idéia de como fazer este cenário funcionar no ambiente web pois não consigo passar Contato e Telefones em um mesmo submit (estou usando Struts 1.3.8 e a persistência funciona perfeitamente se eu não usar relacionamentos).

Se alguém tiver uma idéia de como me ajudar…

Seguem minhas classes:

//Contato.java
package agenda.model.bean;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Type;


@Entity
public class Contato 
{
	@Id
	@GeneratedValue
	@Column(name = "id_contato")
	private long id;
	
	private String nome;
	private String grupo;
	
	@OneToMany(mappedBy = "contato", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	@Type(type="string")
	private List<Telefone> telefone;
	
	public Contato()
	{
		this.telefone = new ArrayList<Telefone>();
	}
	
	public long getId() 
	{
		return id;
	}
	
	public void setId(long id) 
	{
		this.id = id;
	}
	
	public String getNome() 
	{
		return nome;
	}
	
	public void setNome(String nome) 
	{
		this.nome = nome;
	}
	
	public String getGrupo() 
	{
		return grupo;
	}
	
	public void setGrupo(String grupo) 
	{
		this.grupo = grupo;
	}
	
	public List<Telefone> getTelefone() 
	{
		return telefone;
	}
	
	public void setTelefone(Telefone telefone) 
	{
		this.telefone.add(telefone);
	}
	
	public String toString()
	{
		StringBuilder sb = new StringBuilder();
		
		sb.append("Nome: ");
		sb.append(this.nome);
		sb.append("\nGrupo: ");
		sb.append(this.grupo);
		sb.append("\nTelefone(s):\n");
		
		for (Telefone telefone : this.telefone)
		{
			sb.append(telefone.toString());
			sb.append("\n");
		}
		
		return sb.toString();
	}
}
//Telefone.java
package agenda.model.bean;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
public class Telefone 
{
	@Id
	@GeneratedValue
	@Column(name = "id_telefone")
	private long id;
	
	private int ddd;
	private int numero;
	private TelefoneTipo tipo;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "id_contato", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private Contato contato;
	
	public long getId() 
	{
		return id;
	}
	
	public void setId(long id) 
	{
		this.id = id;
	}
	
	public int getDdd() 
	{
		return ddd;
	}
	
	public void setDdd(int ddd) 
	{
		this.ddd = ddd;
	}
	
	public int getNumero()
	{
		return numero;
	}
	
	public void setNumero(int numero) 
	{
		this.numero = numero;
	}
	
	public TelefoneTipo getTipo() 
	{
		return tipo;
	}
	
	public void setTipo(TelefoneTipo tipo) 
	{
		this.tipo = tipo;
	}
	
	public Contato getContato() {
		return contato;
	}

	public void setContato(Contato contato) {
		this.contato = contato;
	}
	
	public String toString()
	{
		return "(" + this.ddd + ")" + " " + this.numero + " - " + this.tipo; 
	}
}
/*
Este aqui é o fragmento de uma de minhas tentativas frustradas de fazer funcionar...
*/
	public ActionForward adicionar(ActionMapping map, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws SQLException
	{
		ContatoForm contatoForm = new ContatoForm();
		
		contatoForm = (ContatoForm)form;

		Contato contato = contatoForm.getContato();
		Telefone telefone = contatoForm.getTelefone();
		
		System.out.println(telefone.toString());
		
		contato.setTelefone(telefone);
		
		DaoFactory daoFactory = new DaoFactory();

		daoFactory.beginTransaction();

		daoFactory.getContatoDao().adicionar(contato);
//		daoFactory.getTelefoneDao().adicionar(telefone);
		
		daoFactory.commit();

		daoFactory.close(); //session.close();

		System.out.println("adicionou");
		
		return this.listar(map, form, request, response);

	}
package agenda.controller.forms;

import org.apache.struts.action.ActionForm;

import agenda.model.bean.Contato;

public class ContatoForm extends ActionForm 
{
	private static final long serialVersionUID = -1389440566692300265L;

	public Contato contato = new Contato();
	
	public Contato getContato()
	{
		return this.contato;
	}
}

Abraços.

3 Respostas

lgi2020

Adicionando a classe que uso pra testar no console…

package teste;

import agenda.model.bean.Contato;
import agenda.model.bean.Telefone;
import agenda.model.bean.TelefoneTipo;
import agenda.model.dao.DaoFactory;

public class TesteAgenda 
{
	public static void main(String[] args) 
	{
		
		Contato contato = new Contato();
		contato.setNome("Contato 1");
		
		Contato contato2 = new Contato();
		contato2.setNome("Contato 2");
		
		
		
		
		Telefone telefone = new Telefone();
		telefone.setDdd(21);
		telefone.setNumero(33334444);
		telefone.setTipo(TelefoneTipo.RESIDENCIAL);
		telefone.setContato(contato);
		
		Telefone telefone2 = new Telefone();
		telefone2.setDdd(21);
		telefone2.setNumero(99998888);
		telefone2.setTipo(TelefoneTipo.CELULAR);
		telefone2.setContato(contato);
		
		
		
		Telefone telefone3 = new Telefone();
		telefone3.setDdd(21);
		telefone3.setNumero(33335555);
		telefone3.setTipo(TelefoneTipo.RESIDENCIAL);
		telefone3.setContato(contato2);
		
		Telefone telefone4 = new Telefone();
		telefone4.setDdd(21);
		telefone4.setNumero(88887777);
		telefone4.setTipo(TelefoneTipo.CELULAR);
		telefone4.setContato(contato2);
		
		contato2.setTelefone(telefone3);
		contato2.setTelefone(telefone4);
		
		DaoFactory daoFactory = new DaoFactory();
		
		daoFactory.beginTransaction();
		
//		daoFactory.getContatoDao().adicionar(contato);
//		daoFactory.getContatoDao().adicionar(contato2);
		
		daoFactory.commit();
		
		for (Object cont : daoFactory.getContatoDao().listar() )
		{
			System.out.println(cont.toString());
		}
		
		daoFactory.close(); //session.close();
		
	}
}

Abraços.

lgi2020

Amigos,

Será que ninguém tem uma idéia para me ajudar? :?

Abraços a todos.

lgi2020

Amigos,

Ninguém consegue me dar uma luz? :frowning:
Ou ninguém viu a mensagem? :cry:

Abraços a todos.

Criado 4 de outubro de 2007
Ultima resposta 8 de out. de 2007
Respostas 3
Participantes 1