HIbernate saveorUpdate() 在更新时插入新记录
HIbernate saveorUpdate() inserting new records while updating
我正在使用 struts2 和休眠集成,方法是遵循此 link http://www.tutorials4u.net/struts2-tutorial/struts2_crud_example.html 并尝试更新记录但不是更新它而是插入新记录,我已经看到了所有在 posting 这个 post 之前休眠更新问题,但其中 none 对我有用所以请我请求在将其标记为重复之前阅读我的问题,因为我已经从已经 post 问题和答案...
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
StudentDAO
的 addStudent()
正在为 id
获取 null
值,我如何设置 addStudent()
的 ID 以便它调用更新方法而不是保存
如果你想更新记录,你需要有它的 ID,SaveOrUpdate 会查找 ID,如果它在你的 table 中,然后它会更新,如果不在,那么它会添加一个新记录。
我不确定你是如何创建你的学生的,但如果你想更新你需要从数据库中获取对象以具有 id(或者如果你知道 id 只是设置它)然后更新你想要的该对象在持久性上下文中并刷新。
这是我的编辑方法。
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>
花了将近 2-3 天后,我得到了解决方案,我在我的 JSP 中提到了 <s:hidden>
标签,我将 id 作为
<s:hidden name="id" />
,为了更新 Hibernate 应该获取 id
,如果失败,它将调用保存方法。
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>
我正在使用 struts2 和休眠集成,方法是遵循此 link http://www.tutorials4u.net/struts2-tutorial/struts2_crud_example.html 并尝试更新记录但不是更新它而是插入新记录,我已经看到了所有在 posting 这个 post 之前休眠更新问题,但其中 none 对我有用所以请我请求在将其标记为重复之前阅读我的问题,因为我已经从已经 post 问题和答案...
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
StudentDAO
的 addStudent()
正在为 id
获取 null
值,我如何设置 addStudent()
的 ID 以便它调用更新方法而不是保存
如果你想更新记录,你需要有它的 ID,SaveOrUpdate 会查找 ID,如果它在你的 table 中,然后它会更新,如果不在,那么它会添加一个新记录。
我不确定你是如何创建你的学生的,但如果你想更新你需要从数据库中获取对象以具有 id(或者如果你知道 id 只是设置它)然后更新你想要的该对象在持久性上下文中并刷新。
这是我的编辑方法。
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>
花了将近 2-3 天后,我得到了解决方案,我在我的 JSP 中提到了 <s:hidden>
标签,我将 id 作为
<s:hidden name="id" />
,为了更新 Hibernate 应该获取 id
,如果失败,它将调用保存方法。
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>