1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Struts + Hibernate: org.hibernate.TransientObjectException: The given object has a null identifier

Estou desenvolvendo um CRUD com Struts 2 e Hibernate. O cadastro e exclusão já estão funcionando bem, mas a edição... não consigo enviar o id do registro da JSP military-edit.jsp para a Action addEdit() realizar o update! Já tentei via get, request, getId()... e quando depuro o resultado sempre é null! Será que alguém pode me explicar o motivo e me ajudar a resolver este problema?

Modelo:

@Entity
@Table(name="Militar")
public class Militar implements Serializable {

    private static final long serialVersionUID = -2848274801937958959L;
    private Long id;
    private Long idt;
    private String cpf;
    private String nome;
    private String nomeGuerra;

    //Getters and Setters

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    @Column(name="idt")
    public Long getIdt() {
        return idt;
    }
    public void setIdt(Long idt) {
        this.idt = idt;
    }
    @Column(name="cpf")
    public String getCpf() {
        return cpf;
    }
    public void setCpf(String cpf) {
        this.cpf = cpf;
    }
    @Column(name="nome")
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    @Column(name="nomeGuerra")
    public String getNomeGuerra() {
        return nomeGuerra;
    }
    public void setNomeGuerra(String nomeGuerra) {
        this.nomeGuerra = nomeGuerra;
    }
}

DAO:

public class MilitarManager extends HibernateUtil {

    public Militar add(Militar militar) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.save(militar);
        session.getTransaction().commit();
        return militar;
    }

    public Militar update(Militar militar) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.update(militar);
        session.getTransaction().commit();
        return militar;
    }

    public Militar delete(Long id) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Militar militar = (Militar) session.load(Militar.class, id);
        if(null != militar) {
            session.delete(militar);
        }
        session.getTransaction().commit();
        return militar;
    }

    public List<Militar> list() {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        List<Militar> lista = null;
        try {
            lista = (List<Militar>) session.createQuery("from Militar").list();
        } catch(HibernateException e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
        session.getTransaction().commit();
        return lista;    
    }

    public Militar getMilitaryById(Long id) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Militar militar = (Militar) session.get(Militar.class, id);
        return militar;
    }
}

Action:

public class MilitarAction extends ActionSupport {

    private Militar militar;
    private Long id, idt;
    private String nome, nomeGuerra, cpf;
    private List<Militar> lista;

    private MilitarManager militarController;

    public MilitarAction() {
        militarController = new MilitarManager();
    }

    public String add() {
        try {
            militarController.add(getMilitar());
        } catch(Exception e) {
            e.printStackTrace();
        }
        System.out.println("Cadastrando militar...");
        this.lista = militarController.list();
        ActionContext.getContext().getSession().put("lista", this.lista);
        return SUCCESS;
    }

    public String delete() {
        militarController.delete(getId());
        this.lista = militarController.list();
        ActionContext.getContext().getSession().put("lista", this.lista);
        return SUCCESS;
    }

    public String edit() {
        Militar militaryWanted = (Militar) militarController.getMilitaryById(getId());
        ActionContext.getContext().getSession().put("militar", militaryWanted);
        return SUCCESS;
    }

    public String addEdited() {
        Militar militaryToUpdate = getMilitar();
        System.out.println(getId());
        try {
            militarController.update(militaryToUpdate);
        } catch(Exception e) {
            e.printStackTrace();
        }
        this.lista = militarController.list();
        ActionContext.getContext().getSession().put("lista", this.lista);
        return SUCCESS;
    }

    public String list() {
        this.lista = militarController.list();
        ActionContext.getContext().getSession().put("lista", this.lista);
        return SUCCESS;
    }

    //Getters and Setters
    public Militar getMilitar() {
        return militar;
    }
    public void setMilitar(Militar militar) {
        this.militar = militar;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public List<Militar> getLista() {
        return lista;
    }
    public void setLista(List<Militar> lista) {
        this.lista = lista;
    }
    //Acrescentados para tentar recuperar os dados para o update
    public Long getIdt() {
        return idt;
    }
    public void setIdt(Long idt) {
        this.idt = idt;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getNomeGuerra() {
        return nomeGuerra;
    }
    public void setNomeGuerra(String nomeGuerra) {
        this.nomeGuerra = nomeGuerra;
    }
    public String getCpf() {
        return cpf;
    }
    public void setCpf(String cpf) {
        this.cpf = cpf;
    }
}

XML Hibernate:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="connection.url">
            jdbc:mysql://localhost:3306/sispro
        </property>
        <property name="connection.username">root</property>
        <property name="connection.password"></property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">
            org.hibernate.dialect.MySQLDialect
        </property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">
            org.hibernate.cache.NoCacheProvider
        </property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>

        <mapping class="br.com.sisprod.model.Militar" />
    </session-factory>
</hibernate-configuration>

XML Struts:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="default" extends="struts-default" namespace="/">

        <action name="add" class="br.com.sisprod.view.MilitarAction" method="add">
            <result name="success">military-list.jsp</result>
            <result name="input">military-add.jsp</result>
        </action>

        <action name="delete" class="br.com.sisprod.view.MilitarAction" method="delete">
            <result name="success">military-list.jsp</result>
        </action>

        <action name="list" class="br.com.sisprod.view.MilitarAction" method="list">
            <result name="success">military-list.jsp</result>
        </action>

        <action name="edit" class="br.com.sisprod.view.MilitarAction" method="edit">
            <result name="success">military-edit.jsp</result>
        </action>

        <action name="addEdited" class="br.com.sisprod.view.MilitarAction" method="addEdited">
            <result name="success">military-list.jsp</result>
            <result name="input">military-edit.jsp</result>
        </action>
    </package>
</struts>

JSP para lista de militares:

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@page import="java.util.List"%>
<%@page import="br.com.sisprod.model.Militar"%>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Sistema de Produtividade da Polícia Militar do Amazonas - Sispro</title>
    <link href="css/bootstrap.css" rel="stylesheet">
    <link href="css/sispro.css" rel="stylesheet">

    <!-- Requisitos para funcionamento dos menus dropdown -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="/TCCSisProd/css/bootstrap.min.css">
      <link rel="stylesheet" href="/TCCSisProd/css/sispro.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
      <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>

</head>
<body>
    <%@ include file="../menu.jsp" %>
    <div align="center" class="container">
        <table class="table" border="1">
            <tr>
                <th>Nome</th>
                <th>Nome de Guerra</th>
                <th>Identidade</th>
                <th>CPF</th>
                <th colspan="2"><div class="text-center">AÇÕES</div></th>
            </tr>
            <%
                HttpSession sessao = request.getSession();
                List<Militar> lista = (List<Militar>) sessao.getAttribute("lista");
            %>
            <s:iterator value="lista" var="militar">
                <tr>
                    <td><s:property value="nome" /></td>
                    <td><s:property value="nomeGuerra" /></td>
                    <td><s:property value="idt" /></td>
                    <td><s:property value="cpf" /></td>
                    <td>
                        <a href="edit?id=<s:property value="id"/>">
                            <img alt="Editar" src="/TCCSisProd/images/editartrnsp.png">
                        </a>
                    </td>
                    <td>
                        <a href="delete?id=<s:property value="id"/>">
                            <img alt="Excluir" src="/TCCSisProd/images/excluirtrnsp.png">
                        </a>
                    </td>
                </tr>    
            </s:iterator>
        </table>
    </div>
</body>
</html>

JSP para edição:

<%@page import="com.opensymphony.xwork2.ActionContext"%>
<%@page import="br.com.sisprod.model.Militar"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Sistema de Produtividade da Polícia Militar do Amazonas - Sispro</title>
    <link href="css/bootstrap.css" rel="stylesheet">
    <link href="css/sispro.css" rel="stylesheet">

    <!-- Requisitos para funcionamento dos menus dropdown -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
      <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</head>
<body>
    <div align="center">
        <%@ include file="../menu.jsp" %>
        <h3>Edição de Militares</h3>
        <s:form action="addEdited" method="post" class="form">
            <s:hidden name="id" value="#session['militar'].id" />
            <s:label name="nome" value="Nome" />
            <s:textfield name="militar.nome" value="%{#session.militar.getNome()}" />
            <s:label name="nomeGuerra" value="Nome de Guerra" />
            <s:textfield name="militar.nomeGuerra" value="%{#session.militar.getNomeGuerra()}" />
            <s:label name="idt" value="Identidade" />
            <s:textfield name="militar.idt" value="%{#session.militar.getIdt()}" />
            <s:label name="cpf" value="CPF" />
            <s:textfield name="militar.cpf" value="%{#session.militar.getCpf()}" />
            <s:submit value="Cadastrar" align="center" />
        </s:form>
    </div>
</body>
</html>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags struts hibernate jsp java-ee ou faça a sua própria pergunta.