我用ssh做一个添删修改程序,框架运转正常,,起码,登陆和添加功能已正常运行,目前要做的就是删除,在这里我贴出一些主要的代码1.现在已确定是UserDAO.java文件中的delete删除方法,就在这里报错,代码如下public boolean  delete(User persistentInstance) {
boolean Flag=false;

log.debug("deleting User instance");

System.out.println("UserDao.java中的delete方法已被执行.......");

try {
getHibernateTemplate().delete(persistentInstance);//这里的delete方法参数一定要实休对像类型的吗?
log.debug("delete successful");
Flag=true;
} catch (RuntimeException re) {
Flag=false;

log.error("delete failed", re);
throw re;

}
return Flag;

}
2.报错提示是:UserDao.java中的delete方法已被执行.......
org.springframework.dao.InvalidDataAccessApiUsageException: the transient instance passed to delete() had a null identifier; nested exception is org.hibernate.TransientObjectException: the transient instance passed to delete() had a null identifier
org.hibernate.TransientObjectException: the transient instance passed to delete() had a null identifier
at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:67)
at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:579)
at org.springframework.orm.hibernate3.HibernateTemplate$27.doInHibernate(HibernateTemplate.java:794)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)
at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:788)
at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:784)
at com.zdw.dao.impl.UserDAO.delete(UserDAO.java:66)
at com.zdw.service.impl.UserService.delete(UserService.java:46)
at com.zdw.web.struts.action.DelAction.execute(DelAction.java:59)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
3.大家会的帮帮忙吧,,,本人实在是新手,,,,我想应该就是接收的数据不合法吧,我只直接给一个string类型的值进去,可以delete方法又不支持string类型数据,,,哎...会的帮一下了,在这里谢谢了...

解决方案 »

  1.   

    org.springframework.dao.InvalidDataAccessApiUsageException: the transient instance passed to delete() had a null identifier;
    你传了个空值,数据库中没有这个USER~~
      

  2.   

    传入的应该是个对象的实例吧,我觉得不是String类型的,传个实例试试
      

  3.   

    delete的参数是Object 类型,写代码的时候你传什么东西都没关系,但是他要求你传的是映射数据库表的实例对象,才能执行数据库中删除该记录的功能
      

  4.   

    恩,没找到那个对象,先通过Id获取user再删除
      

  5.   

    getHibernateTemplate()
    这个事Spring接口提供的方法   新手不怎么会用的(我也是新手)
    所以我都是 用hibernate提供的方法进行操作每一个接口都被Spring注入了sessionFactory  
    sessionFactoey里面有session所以可以写  this.getSessionFactory().openSession().delete()方法
    也可以直接那session  直接写this.getSession().操作就可以了   Spring的接口不熟练的就用session做吧  比较容易点
      

  6.   

    先把你要删除的那个User查出来,再将它传给删除方法
      

  7.   

    delete()方法删除的对象 应该事处于持久状态的对象 也就是处于Hibernate中Session的管理 
    楼主可以将user对象 从数据库中加载出来 然后再删除 就可以了。
      

  8.   

    ............你传的那个user对象连ID主键都没有 怎么去删除 我汗 
      

  9.   

    delete(Object entity)
    delete(final Object entity, final LockMode lockMode)
    delete(String queryString)
    delete(String queryString, Object value, Type type)
    delete(final String queryString, final Object[] values, final Type[] types)
     例子1:
    public void delbyAA(final String aa) {
    this.getHibernateTemplate().execute(new HibernateCallback() {
    public Object doInHibernate(Session session) throws SQLException,
    HibernateException {
    net.share_info.dxw.hibernate.Smkserver aa;
    Query query = session.createQuery(
    "delete com.pigo.TestC where aa = ? ");
    query.setString(0, aa);
    query.executeUpdate();
    return null;
    }
    });
    }
     例子2:String hsql = "delete from xxx where id>5 and id<15";Session session = getHibernateTemplate().getSessionFactory().openSession();
    Transaction ts = session.beginTransaction();
    session.delete(hsql);
    ts.commit();还有,getJdbcTemplate()里有个update(sql,parame);方法
      

  10.   

    对的,就是参数是NULL的,先通过ID或什么先查出User,再把这个对象传进去。
      

  11.   

    修改和删除是一样的,要先查后删。
    /**
     * @create 2009-7-30
     * @return
     * @explain 人员管理-删除人员
     */
    public boolean employeeDel(EmployeeQueryViewBean employeeQueryViewBean) {
    Integer eid = employeeQueryViewBean.getEid();
    Employee employee = employeeDao.findUnique(eid);
    if(employee == null){
    return false;
    }

    return employeeDao.del(employee);
    }
      

  12.   

    对象的 主键Id 一定要设置。
    否则它还是映射不到这个实体。
    先通过Id获取user再删除
      

  13.   

    在数据库中必须有对应的数据的记录
    delete删除时是根据主键删除 没有实际对应的记录 应该会报错
      

  14.   

     org.springframework.dao.InvalidDataAccessApiUsageException: the transient instance passed to delete() had a null identifier; 
      传入一个主键ID啊,就是你要删除的那条记录的ID啊 
      

  15.   

      User userDto= ServiceManager.agent.getAdminResourceService().findById(resourceId);
       resourceId 主键ID,先获得要删除的对象,再调用getHibernateTemplate().delete(userDto);就可以了。
      顺便说下,定义变量第一个字母应小写。
      

  16.   

    看了下你报的异常,“the transient instance passed to delete() had a null identifier”
    传递给delete()方法的这个瞬时实例(对象)是一个null的标识,就是主键为null。
    也就是说你传给这个方法的对象是一个瞬时对象,还没有和数据库建立联系,估计是你new 了一个User对象吧?你应该给delete()方法传递一个持久对象,即数据库中存在的对象。
      

  17.   

    delete是通过主键删除的~USER对象内只需要有主键就可以对其 删除~~~不过USER.HBM.XML中 其它自动的NOT -NULL属性全去掉吧!
      

  18.   

    public  class DBase extends HibernateDaoSupport  {public void delete(Serializable id, Class cla) {
    super.getHibernateTemplate().delete(this.get(id, cla));
    }public Object get(Serializable id, Class cla) {
    return super.getHibernateTemplate().get(cla, id);
    }
    }
      

  19.   

    ORM中可以把对象分为游离态,持久态,你穿的数据是一个游离态的没有被映射到数据库中,所以不能删除.
      

  20.   

    注意看堆栈返回的信息,
    at com.zdw.dao.impl.UserDAO.delete(UserDAO.java:66) 
    这个是你出现问题的根本,你在删除的时候调用的是UserDAO的delete方法,这个方法需要传入一个对象的吧,你是不是传入了一个null啊,仔细查查,或者把这个方法的签名贴出来我看一下。
      

  21.   

    根据主健进行删除照样按照之前的hql语法写。换个方法调用也行...
    public void deleteByHQL(Integer id){
    String hql = "delete from Orders o where o.orderId = ?";
    this.getHibernateTemplate().bulkUpdate(hql,id);
    }
    试试看...