hibernate报错,无法实现添加操作。

报错:

```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的值为空