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.

