2016-11-19 7 views
0

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

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 аннотацию

Id не приходит в 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() так, что он вызывает метод обновления вместо сохранения

ответ

1

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

0

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

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

0

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

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> 
0

Тег 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> 
+0

Спасибо большое, но я сделал то же самое и разместил его как ответ раньше. – Nupur