Hibernate inserção

7 respostas
J

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?

7 Respostas

drsmachado

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.

J

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 <a href="http://javax.persistence.Id">javax.persistence.Id</a>;

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 <a href="http://javax.persistence.Id">javax.persistence.Id</a>;

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);
}

}

drsmachado

Tag [code] por favor.

J

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]

drsmachado

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]


Depois dessa, sem chances de eu ajudar.

Hebert_Coelho

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]

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…

J

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!

Criado 23 de setembro de 2013
Ultima resposta 24 de set. de 2013
Respostas 7
Participantes 3