No.1
  • UID101
  • 粉丝
  • 关注
  • 发帖数
阅读:7263回复:2

Session.delete() 方法报错

楼主#
更多 发布于:2016-04-12 19:00
传对象 调用删除 不能成功 报错  Removing a detached instance
best_for_ys
  • UID89
  • 粉丝
  • 关注
  • 发帖数
沙发#
发布于:2016-04-14 15:25
报错是因为传的对象不是一个持久化对象,而是一个瞬态对象。

delete需要的是一个持久态对象,而传入的是一个瞬态对象
一。瞬态:刚new出来的对象,特点是无持久化标志,无session关联。
二。持久态:瞬态save后变为持久态,特点是有持久化标志,有session关联。对持久态对象的改变会在提交时同步到数据库。
三。托管态。持久态关联的session关闭后,对象变为托管态。特点有持久化标志,没有关联的session。对托管态的改变不会同步到数据库,除非update他



改变持久化对象状态的方法



让瞬态转变为持久化状态:

(1)Serializable save(Object obj):将obj对象变为持久化状态,该对象的属性将被保存到数据库。
(2)Serializable save(Object obj,Object pk):将obj对象保存到数据库,保存到数据库时,指定主键值。
(3)void persist(Object obj):将obj对象变为持久化状态,该对象的属性将被保存到数据库。
(4)void persist(Object obj,Object pk):将obj对象变为持久化状态,保存到数据库时,指定主键值。
我试了一下把主键设置为null,然后persist,就不会报错,但是没有删除,因为persist自动生成一个主键,在数据库里面是没有的。
建议使用这种方式:
@WebRemote
public HashMap<String, Object> delete(Object data) {
    String hql_form="delete from Tb_requisition_form where tb_requisition_form_id=:tb_requisition_form_id";
    String hql_form_detail = "delete Tb_requisition_form_detail where tb_requisition_form_id=:tb_requisition_form_id";
    System.out.println("已经进入到后台程序了");
    Tb_requisition_form tb_requisition_form = (Tb_requisition_form)data;
    DBSession s1 = DataBaseUtil.getHibernateSession();
    HashMap<String,Object> map = new HashMap<String,Object>();
    try{
        DataBaseUtil.beginTransaction(s1);
        s1.createQuery(hql_form).setString("tb_requisition_form_id", tb_requisition_form.getTb_requisition_form_id()).executeUpdate();
        s1.createQuery(hql_form_detail).setString("tb_requisition_form_id", tb_requisition_form.getTb_requisition_form_id()).executeUpdate();
        DataBaseUtil.commitTransaction(s1);
        //dao.getSession().commit();
        map.put("retcode", 1);
        map.put("retmsg", "成功");
         
    }catch(Exception e){
        //dao.getSession().rollback();
        DataBaseUtil.rollbackTransaction(s1);
        map.put("retcode", 0);
        map.put("retmsg", "失败");
    }
    //Tb_requisition_form ex = (Tb_requisition_form) data;
    //HashMap ret = new HashMap();
    //IDao dao = CommonUtil.getServiceFromScaDomain("DaoComponent", IDao.class);
    //dao.getHibernateSession().getTransaction().begin();
    //保存经验主表信息
    //dao.getHibernateSession().save(ex);
    try {
         
        //提交保存文件事务
        //dao.getHibernateSession().getTransaction().commit();
        //ret.put("retmsg", "操作成功");
    } catch (Exception e) {
        e.printStackTrace();
        //dao.getHibernateSession().getTransaction().rollback();
        //ret.put("retmsg", "操作失败");
    }
    return map;
}

409232112
骑士
骑士
  • UID103
  • 粉丝2
  • 关注0
  • 发帖数30
  • 社区居民
板凳#
发布于:2016-04-18 16:06
楼上已经说的很明白了,这里提供一个封装好的一个方法。在Common公共组件里有一个DataObject.java,里面有一个ConvertMapToBean(String beanName, HashMap map)的方法。
你这里获取的只是一个表单数据,并没有与数据库实体类相关联
然后通过DataObjectUtils.deleteDataObject()方式删除,具体实现还是session.delete()
游客

返回顶部