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