[Resolvido]Dúvida Hibernate + V-Raptor

2 respostas
C
Boa tarde pessoal, estou com dúvidas no mapeamento das classes usando Hibernate Annotations, basicamente tenho as tabelas: A regra do banco de dados é: um cliente pode possuir vários telefones cadastrados. Tabela Cliente:
cl_cod_cliente integer (PK)
//...restante dos campos
Tabela Telefone:
te_cod_cliente(FK)
//...restante dos campos

No formulário de cadastro de cliente fiz todos os campos de cadastro de cliente e três campos do tipo texto para cadastrar o telefone comercial, telefone residencial e telefone celular. Basicamente o formulário iria inserir primeiro o cliente na tabela Cliente e depois capturar o código desse cliente para inserir os telefones na tabela Telefone. Abaixo as classes:

Classe Cliente:
package br.bmweb.bean;

import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Table(name="TB_CLIENTE", schema="bmweb") 
@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Cliente {
	private int cod_cliente;
	private String documento, rg, nome, contato, mercado, placa, email, profissao, newsletter;
	private Date data_nascimento, data_cadastro;
	
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	@Column(name="CL_COD_CLIENTE", nullable = false)
	public int getCod_cliente() {
		return cod_cliente;
	}
	public void setCod_cliente(int codCliente) {
		cod_cliente = codCliente;
	}
	
	@OneToMany(mappedBy="cliente", fetch = FetchType.LAZY) 
	@Cascade(CascadeType.ALL) 
	//private Collection<Orcamento> orcamentos; 
	private Orcamento orcamento;
	
	@OneToMany(mappedBy="cliente", fetch = FetchType.LAZY) 
	@Cascade(CascadeType.ALL) 
	//private Collection<Usuario> usuarios;
	private Usuario usuario;
	
	@OneToMany(mappedBy="cliente", fetch = FetchType.LAZY) 
	@Cascade(CascadeType.ALL) 
	//private Collection<Endereco> enderecos; 
	private Endereco endereco;
	
	@OneToMany(mappedBy="cliente", fetch = FetchType.LAZY) 
	@Cascade(CascadeType.ALL) 
	//private Collection<Telefone> telefones; 
	private Telefone telefone;

	public Orcamento getOrcamento() {
		return orcamento;
	}
	public void setOrcamento(Orcamento orcamento) {
		this.orcamento = orcamento;
	}
	public Usuario getUsuario() {
		return usuario;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	public Endereco getEndereco() {
		return endereco;
	}
	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
	public Telefone getTelefone() {
		return telefone;
	}
	public void setTelefone(Telefone telefone) {
		this.telefone = telefone;
	}
	@Column(name="CL_DOCUMENTO", nullable = false)
	public String getDocumento() {
		return documento;
	}
	public void setDocumento(String documento) {
		this.documento = documento;
	}
	
	@Column(name="CL_RG", nullable = false)
	public String getRg() {
		return rg;
	}
	public void setRg(String rg) {
		this.rg = rg;
	}
	
	@Column(name="CL_NOME", nullable = false)
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	@Column(name="CL_CONTATO", nullable = false)
	public String getContato() {
		return contato;
	}
	public void setContato(String contato) {
		this.contato = contato;
	}
	
	@Column(name="CL_MERCADO", nullable = false)
	public String getMercado() {
		return mercado;
	}
	public void setMercado(String mercado) {
		this.mercado = mercado;
	}
	
	@Column(name="CL_PLACA", nullable = false)
	public String getPlaca() {
		return placa;
	}
	public void setPlaca(String placa) {
		this.placa = placa;
	}
	
	@Column(name="CL_EMAIL", nullable = false)
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	@Column(name="CL_PROFISSAO", nullable = false)
	public String getProfissao() {
		return profissao;
	}
	public void setProfissao(String profissao) {
		this.profissao = profissao;
	}
	
	@Column(name="CL_NEWS_LETTER", nullable = false)
	public String getNewsletter() {
		return newsletter;
	}
	public void setNewsletter(String newsletter) {
		this.newsletter = newsletter;
	}
	
	@Column(name="CL_DATA_NASCIMENTO", nullable = false)
	public Date getData_nascimento() {
		return data_nascimento;
	}
	public void setData_nascimento(Date dataNascimento) {
		data_nascimento = dataNascimento;
	}
	
	@Column(name="CL_DATA_CADASTRO", nullable = false)
	public Date getData_cadastro() {
		return data_cadastro;
	}
	public void setData_cadastro(Date dataCadastro) {
		data_cadastro = dataCadastro;
	}
}
Classe Telefone:
package br.bmweb.bean;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name="TB_TELEFONE", schema="bmweb")
@DiscriminatorValue("2")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Telefone extends Cliente{
	private int cod_fone, cod_cliente;
	private String ddd, telefone, ramal, tipo_fone;
	
	@Id
	@GeneratedValue
	@Column(name="TE_COD_TELEFONE", nullable = false)
	public int getCod_fone() {
		return cod_fone;
	}
	public void setCod_fone(int codFone) {
		cod_fone = codFone;
	}
	
	@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
	@JoinColumn(name="CL_COD_CLIENTE")
	//@Column(name = "TE_COD_CLIENTE", nullable = false) 
	private Cliente cliente;
	//Cliente cliente = new Cliente();
	
	@Column(name="TE_COD_CLIENTE", nullable = false)
	public int getCod_cliente() {
		return cod_cliente;
	}
	public Cliente getCliente() {
		return cliente;
	}
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	public void setCod_cliente(int codCliente) {
		cod_cliente = codCliente;
	}
	
	@Column(name="TE_DDD", nullable = false)
	public String getDdd() {
		return ddd;
	}
	public void setDdd(String ddd) {
		this.ddd = ddd;
	}
	
	@Column(name="TE_FONE", nullable = false)
	public String getTelefone() {
		return telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	
	@Column(name="TE_RAMAL", nullable = false)
	public String getRamal() {
		return ramal;
	}
	public void setRamal(String ramal) {
		this.ramal = ramal;
	}
	
	@Column(name="TE_TIPO_FONE", nullable = false)
	public String getTipo_fone() {
		return tipo_fone;
	}
	public void setTipo_fone(String tipoFone) {
		tipo_fone = tipoFone;
	}
}
ClienteController:
public void adiciona(Cliente cliente){
		validator.onErrorUse(Results.page()).of(ClienteController.class).index2();
		Telefone telefone = new Telefone();	
		daotelefone.gravar(telefone);
		dao.gravar(cliente);		
		result.redirectTo(ClienteController.class).index2();
	}
ClienteDao:
public class ClienteDao {
	public void gravar(Cliente cliente){
		Session session = new AbreSession().getSession();
		Transaction tx = session.beginTransaction();
		Telefone telefone = new Telefone();	
		cliente.setTelefone(telefone);
		telefone.setCliente(cliente);
		session.save(telefone);	
		session.save(cliente);		
		tx.commit();		
		session.close();
	}

}
TelefoneController:
public void adiciona(Telefone telefone){
		dao.gravar(telefone);
		
	}
TelefoneDao:
public void gravar(Telefone telefone){
		Session session = new AbreSession().getSession();
		Transaction tx = session.beginTransaction();
		session.save(telefone);
		tx.commit();
		session.close();
	}
JSP: [code]
Nome do Cliente:
 
Documento:
 
RG:
        Data Nascimento:
  Profissão:   E-mail:  
Telefone Celular:
DDD:
Telefone:
  //Campos setados com valores apenas para testes Ate agora estou tentando na action "adiciona" da classe ClienteController para que salve os dados do formulario tanto na tabela cliente e tambem na tabela telefone. Atualmente quando preencho o formulario e clico em salvar esta apenas salvando na tabela cliente. Minhas perguntas sao: 1- Atraves da classe ClienteController consigo acessar os metodos de insercao de outra Controller? 2 - Meus mapeamentos estao corretos?

2 Respostas

C
Pessoal meu problema resolvi parcialmente, corrigi na o mapeamento na classe Telefone, deixando algo como:
Entity
@Table(name="TB_TELEFONE", schema="bmweb")
//@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Telefone {
	private int cod_fone, cod_cliente;
	private String ddd, telefone, ramal, tipo_fone;
	
	@Id
	@GeneratedValue
	@Column(name="TE_COD_FONE", nullable = false)
	public int getCod_fone() {
		return cod_fone;
	}
	public void setCod_fone(int codFone) {
		cod_fone = codFone;
	}
	
	@ManyToOne(targetEntity=Cliente.class, fetch = FetchType.LAZY)
	@JoinTable(name="tb_telefone", joinColumns = @JoinColumn(name="TE_COD_CLIENTE"),
								   inverseJoinColumns = @JoinColumn(name="CL_COD_CLIENTE")
			   )
	private List<Cliente> cliente;
Meu problema agora está no formulário HTML, pois meu formulário HTML tem algo como:
<form name="formCadastroCliente" method="post" action="adiciona" onsubmit="javascript:return validaForm()">
<input name="cliente.profissao" type="text" class="BMWEB" id="cliente.profissao" size="35" maxlength="200" /></td>
<tr class="BMWEB">
      <td height="13" class="BMWEB style29">&nbsp;</td>
      <td><div align="left"><span class="BMWEB style22 style30">Telefone Celular:</span> </div></td>
      <td><div align="right"><span class="style22 style30">DDD:  </span></div></td>
      <td><div align="right"><span class="style30">
        <input name="telefone.ddd" type="text" class="BMWEB" id="ddd" value="41" size="2" maxlength="4" />
      </span></div></td>
      <td><div align="right" class="style30"><span class="style22">
      Telefone:</span></div></td>
      <td>&nbsp;</td>
      <td><span class="style30">
        <input name="telefone.telefone" type="text" class="BMWEB" id="telefone" value="" size="15" />
      </span></td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
</form>
Ou seja, o V-Raptor tá setando corretamente os campos que começam com name="cliente.", exemplo: o campo cliente.profissao do html o V-Raptor enxerga e seta corretamente na classe Cliente mas o campo telefone.ddd o V-Raptor não está setando na classe Telefone. O V-Raptor mostrou isso quando cliquei no botão salvar do formulário:
23:20:35,900 DEBUG [OgnlParametersProvider] Applying telefone.ddd with [41]
23:20:35,900 DEBUG [OgnlParametersProvider] cant find property for expression telefone.ddd ignoring
Pelo que entendi ele ignorou o valor do campo. Como posso resolver isto? Alguém tem alguma idéia??
C
Bom, seguindo o tópico [url]http://www.guj.com.br/posts/list/218131.java[/url] e [url]http://www.guj.com.br/posts/list/204789.java[/url], consegui resolver minha dúvida, fiz basicamente alterações na minha classe ClienteController e ClienteDao deixando da seguinte forma: ClienteController:
public void adiciona(Cliente cliente, Telefone telefone){
		validator.onErrorUse(Results.page()).of(ClienteController.class).index2();
		//Telefone telefone = new Telefone();	
		daotelefone.gravar(telefone);
		dao.gravar(cliente);		
		result.redirectTo(ClienteController.class).index2();
	}
ClienteDao:
@Component
public class ClienteDao {
	public void gravar(Cliente cliente){
		Session session = new AbreSession().getSession();
		Transaction tx = session.beginTransaction();
		session.save(cliente);		
		tx.commit();		
		session.close();
	}

}
Criado 11 de setembro de 2010
Ultima resposta 12 de set. de 2010
Respostas 2
Participantes 1