HIbernate saveorUpdate() вставка новых записей при обновлении

Я использую Struts2 и hibernate Integration, перейдя по этой ссылке http://www.tutorials4u.net/struts2-tutorial/struts2_crud_example.html и пытаюсь обновить записи, но вместо обновления вставляю новые записи, я видел все спящие обновляйте вопросы перед публикацией этого поста, но ни один из них не работал для меня, поэтому, пожалуйста, я прошу прочитать мой вопрос, прежде чем пометить его как дубликат, поскольку я много пробовал из уже опубликованных вопросов и ответов...

AddStudentAction.java

public class AddStudentAction extends ActionSupport implements
        ModelDriven<Student> {

    public AddStudentAction() {
        // TODO Auto-generated constructor stub
    }

    Student student = new Student();

    private String firstName;

    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstNameSearch(String firstName) {
        this.firstName = firstName;
    }

    List<Student> students = new ArrayList<Student>();

    List<Student> studentFirstNames = new ArrayList<Student>();

    public List<Student> getStudentFirstNames() {
        return studentFirstNames;
    }

    public void setStudentFirstNames(List<Student> studentFirstNames) {
        this.studentFirstNames = studentFirstNames;
    }

    StudentDAO dao = new StudentDAO();

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    public StudentDAO getDao() {
        return dao;
    }

    public void setDao(StudentDAO dao) {
        this.dao = dao;
    }

    @Override
    public Student getModel() {
        // TODO Auto-generated method stub
        return student;
    }
@Override
public String execute() {
    // TODO Auto-generated method stub
    dao.addStudent(student);
    String f = student.getFirstName();
    String l = student.getLastName();
    int m = student.getMarks();
    System.out.println(f + l + m + "Inside execute method");
    return "success";
}

public String updateStudent() {

    dao.addStudent(student);
    return "success";
}

public String listStudents() {
    students = dao.getStudents();
    return "success";
}
public String editStudent() {
    HttpServletRequest request = (HttpServletRequest) ActionContext
            .getContext().get(ServletActionContext.HTTP_REQUEST);
    student = dao.listStudentById(Integer.parseInt((request
            .getParameter("id"))));

    student.setId(Integer.parseInt((request.getParameter("id"))));

    System.out.println(request.getParameter("id") + "id in editStudent");
    dao.updateStudent(student);

    return SUCCESS;
}

StudentDAO.java

public class StudentDAO {
@SessionTarget
Session session;

@TransactionTarget
Transaction transaction;
public void addStudent(Student student) {
    try {
        session.saveOrUpdate(student);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void updateStudent(Student student) {
    try {

        session.saveOrUpdate(student);
        session.flush();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public Student listStudentById(int Id) {
    Student student = null;
    try {
        student = (Student) session.get(Student.class, Id);
    } catch (Exception e) {

    }
    return student;
}

}

Student.java

    package com.struts2hibernatepagination.hibernate;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "student")
public class Student {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "first_name")
    private String firstName;
    private int marks;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public int getMarks() {
        return marks;
    }

    public void setMarks(int marks) {
        this.marks = marks;
    }

}

struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<package name="default" extends="hibernate-default">
<action name="addStudent" method="execute"
        class="com.struts2hibernatepagination.action.AddStudentAction">
        <interceptor-ref name="defaultStackHibernateStrutsValidation">
            <param name="validation.excludeMethods">listStudents</param>
            <param name="validation.excludeMethods">fetchStudentList</param>
        </interceptor-ref>
        <result name="success" type="redirect">
            listStudents
        </result>
        <result name="input">/student.jsp</result>
    </action>
<action name="editStudent"
        class="com.struts2hibernatepagination.action.AddStudentAction"
        method="editStudent">
        <interceptor-ref name="basicStackHibernate" />
        <result name="success">/student.jsp</result>
    </action>
</package>

hibernate.cfg.xml

 <?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>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">admin12345</property>
        <property name="hibernate.connection.url">jdbc:mysql://192.168.1.3:3306/nupur</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <mapping class="com.struts2hibernatepagination.hibernate.Student" />
    </session-factory>
</hibernate-configuration>

student.jsp

   <%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<html>
<head>
<title>Hello World</title>
<s:head />
</head>
<body>
    <a href="searchStudent.jsp">Search</a>
    <s:form action="addStudent">
        <s:actionerror />
        <s:textfield name="firstName" label="First Name" />
        <s:textfield name="lastName" label="Last Name" />
        <s:textfield name="marks" label="Marks" />
        <s:submit value="Save" />
        <hr />
        <table border="2">
            <tr bgcolor="cyan">
                <th><u>First Name</u></th>
                <th><u>Last Name</u></th>
                <th><u>Marks</u></th>
                <th><u>Edit</u></th>
                <th><u>Delete</u></th>
            </tr>
            <s:iterator value="students">
                <tr>
                    <td><s:property value="firstName" /></td>
                    <td><s:property value="lastName" /></td>
                    <td><s:property value="marks" /></td>
                    <td><s:url id="editURL" action="editStudent">
                            <s:param name="id" value="%{id}"></s:param>
                        </s:url> <s:a href="%{editURL}">Edit</s:a></td>
                    <td><s:url id="deleteURL" action="deleteStudent">
                            <s:param name="id" value="%{id}"></s:param>
                        </s:url> <s:a href="%{deleteURL}">Delete</s:a></td>
                </tr>
            </s:iterator>
        </table>

    </s:form>

    <s:form action="fetchStudentList">
        <s:submit value="Show"></s:submit>

    </s:form>


</body>
</html>

Пожалуйста, помогите мне... Поскольку я перепробовал все способы, будь то использование session.flush() или удаление аннотации @GeneratedValue

Я не пришел в addStudent()

public String editStudent() {
HttpServletRequest request = (HttpServletRequest) ActionContext
                        .getContext().get(ServletActionContext.HTTP_REQUEST);
                dao.listStudentById(Integer.parseInt((request.getParameter("id"))));                return SUCCESS;
            } //AddStudetnAction class method

                                                                         public void addStudent(Student student) {
                try {  
                System.out.println(student.getId() + "In DAO addStudent");// returning null
                 session.saveOrUpdate(student);

                } catch (Exception e) {
                    e.printStackTrace();
                }

  //StudentDAO class method                                                                                       

addStudent() из StudentDAOстановится null значение для idКак я могу установить идентификатор для addStudent() так что он вызывает метод обновления вместо сохранения

4 ответа

Решение

Потратив почти 2-3 дня, я получил решение, я упомянул <s:hidden> тег в моем JSP, откуда я передаю идентификатор как <s:hidden name="id" />, чтобы обновить Hibernate должен получить id и если это не удастся сделать, он вызовет метод save.

Вот мой метод редактирования.

StudentAction.java

public String edit()
{
    HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
    student = studentDAO.listStudentsById(Long.parseLong(request.getParameter("id")));

    return SUCCESS;
}

StudentList.jsp

<s:url id="editURL" action="edit">
                        <s:param name="id" value="%{id}"></s:param>
                    </s:url> 
                    <s:a href="%{editURL}">Edit</s:a>

Если вы хотите обновить запись, вам нужен ее идентификатор, SaveOrUpdate ищет идентификатор, если он есть в вашей таблице, затем он обновляет, если его нет, то добавляет новую запись.

Я не уверен, как вы создаете своего студента, но если вы хотите обновить, вам нужно получить объект из базы данных, чтобы иметь идентификатор (или, если вы знаете, идентификатор просто установить его), а затем обновить то, что вы хотите, пока объект находится в постоянный контекст и флеш.

s:form тег не позволяет использовать какой-либо параметр в URL, но вы можете использовать hidden поле ввода. s:form по умолчанию тег POST метод.

<s:form action="addStudent">
    <s:actionerror />
    <s:textfield name="firstName" label="First Name" />
    <s:textfield name="lastName" label="Last Name" />
    <s:textfield name="marks" label="Marks" />
    <s:hidden name="id"/>
    <s:submit value="Save" />
    ...
</s:form>
Другие вопросы по тегам