Hibernate inserção

Ola galera,

Possuo uma pagina.jsp que passa pelo filter(pega conexão com o banco de dados), e redirecionado para uma Action que por sua vez verifica a classe e o metodo que serão utilizados, faz a instancia da classe e em seguida utiliza o metodo, ex:

PAGINA.JSP

Funcionário/Inserir

<form method="post" action="funcionario.do" target="fDir" > 
	Nome: <input class="campo" type="text" name="nome" /> <br/><br/>	
	Cargo: 	
	<select name="cargo" class="campo">
	<%
	Cargo crg = new Cargo();
	List<Cargo> listaCargo = (List<Cargo>) crg.getLista(request, response); 
	for(Cargo cargo:listaCargo){ %>
	<option value="<%=cargo.getId()%>"><%= cargo.getDesc() %></option> 
	<%} %>
	</select><br /><br/>	

	<input type="hidden" name="formclasse" value="Funcionario" />	
	<input type="hidden" name="operacao" value="incluir" />	
	<hr style="width:49%;float:left" /><br/>	
	<input type="submit" value="Confirmar" /> 
</form>
<iframe name="fDir" class="fDir"></iframe>

WEB.XML

FiltraDeConexao
br.com.caelum.filter.FilterConexao


FiltraDeConexao
/*

<!-- servlet de controle  -->
<servlet>
	<servlet-name>testeDeStruts</servlet-name>
	<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
	<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>testeDeStruts</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>

FILTER
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
Session session = HibernateUtil.abrirSessao();
request.setAttribute(“session”,session);
chain.doFilter(request,response);
HibernateUtil.fecharSessao(session);
}

ACTION
public class ControllerStruts extends Action{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception{
String inst = request.getParameter(“formclasse”);
String nomeDaClasse = “br.com.caelum.entidade.”+inst;
String operacao = request.getParameter(“operacao”);
Class classes = Class.forName(nomeDaClasse);
Logica logica = (Logica) classes.newInstance();
if(operacao.equals(“incluir”)){
logica.inclui(request, response);
return mapping.findForward(“incluir”);

}else if(operacao.equals(“procurarAltera”)){
logica.procuraAltera(request, response);
return mapping.findForward(“procurarAltera”);

}else if(operacao.equals(“alterar”)){
logica.altera(request, response);
return mapping.findForward(“alterar”);

}else if(operacao.equals(“remover”)){
logica.remove(request, response);
return mapping.findForward(“remover”);

}else if(operacao.equals(“buscar”)){
logica.buscar(request, response);
return mapping.findForward(“buscatabela”);

}
return null;
}
}

[color=red]A minha formclasse possui o nome de Funcionario, logo irei instancia e chamar o medodo incluir de Funcionario [/color]

FUNCIONARIO.JAVA
public void inclui(HttpServletRequest request, HttpServletResponse response)
throws Exception {
getConstrutor(request, response);
// a variavel funcionario esta declara no construtor
funcionario.setNome(request.getParameter(“nome”));
Cargo cargo = new Cargo();
cargo.setId(Long.parseLong(request.getParameter(“cargo”)));
funcionario.setCargo(cargo);
dao.save(funcionario);
request.setAttribute(“funcionario”, funcionario);
}

DAO.JAVA
//SAVE-----
public void save(T objeto){
session.save(objeto);
}

STRUTS.CONFIG.XML






FUNC_RETORNOCUD.JSP

<% Funcionario funcionario = (Funcionario) request.getAttribute("funcionario"); String item = "A ação "+ request.getParameter("operacao")+" - "+ request.getParameter("formclasse")+" "+"foi executada com sucesso!"; %> <%= item %>

ID:<%= funcionario.getId() %>
NOME:<%= funcionario.getNome() %>
SEXO:<%= funcionario.getSexo() %>
CPF:<%= funcionario.getCpf() %>
DT NASC:<%= funcionario.getDtnasc() %>

CEP:<%= funcionario.getLogradouro() %>

CARGO:<%= funcionario.getCargo()%>

CIVIL:<%= funcionario.getCivil()%>

PROBLEMA:
Ao inserir, o dado em funcionario o campo onde deveria conter o id de cargo fica null, ou seja o hibernate de alguma forma não consegue distinguir o id e adicionar do devido campo de formulario.

MAPEAMENTO:

FUNCIONARIO:
private Cargo cargo;

@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = “id_crg”, referencedColumnName = “id_crg”, insertable = false, updatable = false)
@Fetch(FetchMode.JOIN)
@Cascade(org.hibernate.annotations.CascadeType.REFRESH)
public Cargo getCargo() { return cargo; }
public void setCargo(Cargo cargo) { this.cargo = cargo; }

CARGO:
@OneToMany(mappedBy=“cargo”,fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Collection funcionario;

CARDINALIDADE: 1 funcionario deve ter apenas 1 cargo e no maximo 1 cargo / 1 cargo deve ter no minimo 1 funcionario e no maximo N funcionario, tem alguma coisa erra no que eu fiz?

Utilize a tag [code] para postar códigos.
Se você tem um OneToMany no Cargo, por que tem um OneToOne no Funcionario? Deveria ser ManyToOne.

Fiz a alteração de @ManyToOne mas não surtiu efeito! obrigado pelo retorno.

// FUNCIONARIO.JAVA -------------------------

package br.com.caelum.entidade;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Column;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.Session;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import sun.security.jca.GetInstance;
import br.com.caelum.hibernate.CrudDAO;

@Entity
@Table(name = “funcionario”)
public class Funcionario implements Serializable,Logica {
private static final long serialVersionUID = 1L;

CrudDAO<Funcionario> dao;
Funcionario funcionario;
Calendar data;
public Funcionario() {	}

public Funcionario(HttpServletRequest request) {
	dao = new CrudDAO<Funcionario>(Funcionario.class, (Session) request.getAttribute("session"));
	funcionario = new Funcionario();
	data = Calendar.getInstance();
}


private Long id;
private Cargo cargo;	
private String nome;


@Id 	@GeneratedValue(strategy = GenerationType.IDENTITY)	@Column(name = "id_func", nullable = false)
public Long getId() {		return id;	}
public void setId(Long id) {		this.id = id;	}

@ManyToOne(fetch = FetchType.EAGER) 	
@JoinColumn(name = "id_crg", referencedColumnName = "id_crg", insertable = false, updatable = false)	
@Fetch(FetchMode.JOIN)	
@Cascade(org.hibernate.annotations.CascadeType.REFRESH)
public Cargo getCargo() {		return cargo;	}
public void setCargo(Cargo cargo) {		this.cargo = cargo;	}

@Column(name = "nome_func", nullable = false)
public String getNome() {		return nome;	}
public void setNome(String nome) {		this.nome = nome;	}

// ########################################################

@Override
public void inclui(HttpServletRequest request, HttpServletResponse response)
		throws Exception {
	getConstrutor(request, response);
	// o Id e auto incremento!
	funcionario.setNome(request.getParameter("nome"));
	Cargo cargo = new Cargo(); 
	cargo.setId(Long.parseLong(request.getParameter("cargo")));
	funcionario.setCargo(cargo);	
	dao.save(funcionario);
}

@Override
public void getConstrutor(HttpServletRequest request,
		HttpServletResponse response) throws Exception {
	dao = new CrudDAO<Funcionario>(Funcionario.class, (Session) request.getAttribute("session"));	
	funcionario = new Funcionario();
	
}

}

//CARGO.JAVA -------------------------

package br.com.caelum.entidade;

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

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Column;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.Session;
import org.w3c.dom.ranges.RangeException;
import javax.persistence.CascadeType;

import br.com.caelum.hibernate.CrudDAO;

import com.sun.istack.internal.NotNull;

@Entity
@Table(name=“cargo”)
public class Cargo implements Serializable,Logica {
private static final long serialVersionUID = 1L;

CrudDAO <Cargo> dao;
Cargo cargo;

private Long id;
private String desc;
private double salario;

@OneToMany(mappedBy="cargo",fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Collection <Funcionario> funcionario;
//########################################################


@Id  @GeneratedValue(strategy = GenerationType.IDENTITY) @Column (name="id_crg")
public Long getId() {		return id;	}
public void setId(Long id) {		this.id = id;	}

@NotNull @Column (name="desc_crg") 
public String getDesc() {		return desc;	}
public void setDesc(String desc) {		this.desc = desc;	}

@NotNull @Column (name="salario_crg")
public double getSalario() {		return salario;	}
public void setSalario(double salario) {		this.salario = salario;	}

//CrudDAO.java -------------------------

package br.com.caelum.hibernate;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

public class CrudDAO {

private Session session;
private Class classe;

public CrudDAO( Class classe,Session session ) {
	this.classe = classe;
	this.session = session;		
}

/*###########################################################*/

//SAVE-----
public void save(T objeto){		
	session.save(objeto);
}

}

Tag [code] por favor.

PARECE QUE E UM PROBLEMA DE MAPEAMENTO NO QUAL AO INSERIR O OBJETO cargo em funcionario o mepeamento não entende que deve colocar o codigo de cargo na tabela funcionario, apenas fica com endereço do objeto em memória, resolvi trocar o tipo de dados de PRIVATE CARGO cargo para PRIVATE LONG cargo, o hibernate reclamou um erro de mapeamento, pensei que se coloca se o formato de que consta no banco iria da certo.

[color=red]Aguardando retorno… My help!!! [/color]

[quote=joao.passos][color=green][size=18]PARECE QUE E UM PROBLEMA DE MAPEAMENTO NO QUAL AO INSERIR O OBJETO cargo em funcionario o mepeamento não entende que deve colocar o codigo de cargo na tabela funcionario, apenas fica com endereço do objeto em memória, resolvi trocar o tipo de dados de PRIVATE CARGO cargo para PRIVATE LONG cargo, o hibernate reclamou um erro de mapeamento, pensei que se coloca se o formato de que consta no banco iria da certo.[/size][/color]

[color=red]Aguardando retorno… My help!!! [/color][/quote]
Depois dessa, sem chances de eu ajudar.

[quote=joao.passos][color=green][size=18]PARECE QUE E UM PROBLEMA DE MAPEAMENTO NO QUAL AO INSERIR O OBJETO cargo em funcionario o mepeamento não entende que deve colocar o codigo de cargo na tabela funcionario, apenas fica com endereço do objeto em memória, resolvi trocar o tipo de dados de PRIVATE CARGO cargo para PRIVATE LONG cargo, o hibernate reclamou um erro de mapeamento, pensei que se coloca se o formato de que consta no banco iria da certo.[/size][/color]

[color=red]Aguardando retorno… My help!!! [/color][/quote]Pra que isso?

Desnecessário e só afasta as pessoas de quererem te ajudar… sem falar que pediram para você colocar seu código entre as tags [code ] parece que foi o mesmo que ñ falar…

Ola drsmachado,

Não foi minha intenção criar essa situação, criei um novo projeto no qual tinha duas classes Carro e Modelo e deu certo! Obrigado pela ajuda, você tinha razão em relação ao @ManyToOne.

value e desculpa por qualquer coisa!