阅读:7263回复:2
Session.delete() 方法报错
传对象 调用删除 不能成功 报错 Removing a detached instance
|
|
沙发#
发布于: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; } |
|
板凳#
发布于:2016-04-18 16:06
楼上已经说的很明白了,这里提供一个封装好的一个方法。在Common公共组件里有一个DataObject.java,里面有一个ConvertMapToBean(String beanName, HashMap map)的方法。
你这里获取的只是一个表单数据,并没有与数据库实体类相关联 然后通过DataObjectUtils.deleteDataObject()方式删除,具体实现还是session.delete() |
|