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?