报错:
```org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.entity.FruitEntity
at org.hibernate.id.Assigned.generate(Assigned.java:52)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:206)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:191)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:764)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:756)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:752)
at com.dao.FruitDao.fruit_add(FruitDao.java:62)
at com.dao.FruitDao$$FastClassByCGLIB$$f8734927.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:701)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:634)
at com.dao.FruitDao$$EnhancerByCGLIB$$47015c58.fruit_add()
at com.mvc.FruitController.fruit_add(FruitController.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:958)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:452)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1087)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
FruitDao.java页面:
package com.dao;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.entity.FruitEntity;
import com.model.Fruit;
@Repository
@Transactional
public class FruitDao {
@Autowired
SessionFactory sessionFactory;
public Map<String, Object> fruit_showUser(String selsno,String selfruitname,String selfruitype){
Map<String, Object> map = new HashMap<String, Object>();
try{
Session session = sessionFactory.getCurrentSession();
Criteria criteria=session.createCriteria(FruitEntity.class); //将数据库中的表读取出来转换为xxEntity对象
if(selsno!=null && !selsno.equals(""))
criteria.add(Restrictions.like("sno", "%"+selsno+"%")); //Criteria :条件查询
if(selfruitname!=null && !selfruitname.equals(""))
criteria.add(Restrictions.like("fruitname", "%"+selfruitname+"%"));
if(selfruitype!=null && !selfruitype.equals(""))
criteria.add(Restrictions.like("fruitype", "%"+selfruitype+"%"));
List fruitEntitys =criteria.list();
map.put("fruitList", fruitEntitys);
map.put("msg", "success1");
return map;
}catch(Exception e){
e.printStackTrace();
map.put("fruitList", null);
map.put("msg", "error2");
return map;
}
}
public String fruit_add(Fruit fruit){
try {
Session session = sessionFactory.getCurrentSession();
FruitEntity f = new FruitEntity();
f.setFruitname(fruit.getFruitname());
f.setPassword(fruit.getPassword());
f.setFruitype(fruit.getFruitname());
f.setFruitcolor(fruit.getFruitcolor());
f.setFruitnumber(fruit.getFruitnumber());
f.setFruitletter(fruit.getFruitletter());
f.setSno(fruit.getSno());
session.save(f);
return "success1";
} catch (HibernateException e) {
e.printStackTrace();
return "error2";
}
}
public String fruit_delete(String sno){
try {
Session session = sessionFactory.getCurrentSession();
FruitEntity fruit = (FruitEntity) session.load(FruitEntity.class, sno);
session.delete(fruit);
return "success1";
} catch (HibernateException e) {
e.printStackTrace();
return "errror2";
}
}
public String fruit_edit(Fruit fruit){
try {
//步骤:1、获得原有的记录
Session session = sessionFactory.getCurrentSession();
FruitEntity fruitEntity = (FruitEntity) session.load(FruitEntity.class, fruit.getSno()); //获得原有数据库中的数据
// 2、更新原来记录 //load()方法第二个参数只能是主键
fruitEntity.setFruitname(fruit.getFruitname());
fruitEntity.setFruitype(fruit.getFruitype());
fruitEntity.setFruitcolor(fruit.getFruitcolor());
fruitEntity.setFruitnumber(fruit.getFruitnumber());
fruitEntity.setFruitletter(fruit.getFruitletter());
session.update(fruitEntity);
return "success1";
} catch (HibernateException e) {
e.printStackTrace();
return "error2";
}
}
}
FruitController页面:
```package com.mvc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.common.DataOption;
import com.dao.FruitDao;
import com.model.Fruit;
@Controller
public class FruitController {
@Autowired
FruitDao fruitDao;
@RequestMapping("fruit_login")
public String fruit_login(Fruit fruit){ //前台过来的数据自动和Fruit类中的属性结合
String sno= fruit.getSno();
String fruitname= fruit.getFruitname();
String fruitype= fruit.getFruitype();
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DataOption.getConnection();
Statement stat = con.createStatement();
stat.executeQuery("select * from fruit");
ResultSet rs = stat.executeQuery("select * from fruit where fruitname = '"+fruitname+"'");
if (rs.next()) {
if (rs.getString("fruitype").equals(fruitype))/* 其中前一个password为数据库中的密码,而后面一个password是前端传送的密码*/
{
return "redirect:fruit.jsp";//重定向
} else {
return "error";
}
} else {
return "error";
}
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
@RequestMapping("fruit_add")
public String fruit_add(ModelMap map,Fruit fruit){
String r = fruitDao.fruit_add(fruit);
if(r.equals("success1")){
map.addAttribute("message", "添加成功");
map.addAttribute("contect", "fruit_showUser");
return "success1";
}else{
map.addAttribute("message", "添加失败");
map.addAttribute("contect", "fruit_showUser");
return "errror2";
}
}
@RequestMapping("fruit_delete")
public String fruit_delete(Model mav,String sno){
String r = fruitDao.fruit_delete(sno);
if(r.equals("success1")){
mav.addAttribute("message", "删除成功");
mav.addAttribute("contect", "fruit_showUser");
return "success1";
}else{
mav.addAttribute("message", "删除失败");
mav.addAttribute("contect", "fruit_showUser");
return "errror2";
}
}
@RequestMapping("fruit_showUser")
public ModelAndView fruit_showUser(String selsno,String selfruitname,String selfruitype){
ModelAndView mav = new ModelAndView();
Map<String,Object> map = fruitDao.fruit_showUser(selsno, selfruitname, selfruitype);
if(map.get("msg").equals("success1")){
mav.addObject("fruitList", map.get("fruitList"));
mav.setViewName("/fruit/fruitmanage");
return mav;
}else{
mav.addObject("fruitList", null);
mav.setViewName("error2");
mav.addObject("contect", "fruit_showUser");
return mav;
}
}
@RequestMapping("fruit_edit")
public ModelAndView fruit_edit(Fruit fruit){
ModelAndView mav = new ModelAndView();
String r = fruitDao.fruit_edit(fruit);
if(r.equals("success1")){
mav.addObject("message", "修改成功");
mav.addObject("contect", "fruit_showUser");
mav.setViewName("success1");
return mav;
}else{
mav.addObject("message", "修改失败");
mav.addObject("contect", "fruit_showUser");
mav.setViewName("errror2");
return mav;
}
}
}
FruitEntity页面:
package com.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity //标识实体类
@Table(name="fruit")
public class FruitEntity {
@Id //表示sno是主键
@Column(name="sno",length=9) //绑定当前类中的sno与数据表中的sno字段绑定
private String sno;
@Column(name="fruitname",length=20)
private String fruitname;
@Column(name="password",length=20)
private String password;
@Column(name="fruitype",length=20)
private String fruitype;
@Column(name="fruitcolor",length=20)
private String fruitcolor;
@Column(name="fruitnumber",length=2)
private String fruitnumber;
@Column(name="fruitletter",length=2)
private String fruitletter;
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
public String getFruitname() {
return fruitname;
}
public void setFruitname(String fruitname) {
this.fruitname = fruitname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFruitype() {
return fruitype;
}
public void setFruitype(String fruitype) {
this.fruitype = fruitype;
}
public String getFruitcolor() {
return fruitcolor;
}
public void setFruitcolor(String fruitcolor) {
this.fruitcolor = fruitcolor;
}
public String getFruitnumber() {
return fruitnumber;
}
public void setFruitnumber(String fruitnumber) {
this.fruitnumber = fruitnumber;
}
public String getFruitletter() {
return fruitletter;
}
public void setFruitletter(String fruitletter) {
this.fruitletter = fruitletter;
}
}
存在为题的地方可能有两处
1. 你的实体类中的id,没有定义自动添加,无论是自增长、还是自动生成UUID
2.你调用save方法时,传入的实体类的sno的值为空