关于hibernate删除数据时出现的异常问题!

问题描述

各位大侠。小弟最近做个应用,我在页面进行数据删除的时候出了一些问题,希望各位帮忙看看! 具体情况:我的应用是基于struts2+spring2.5+hibernate3.2.我的数据库表是通过hibernate生成的,在映射文件上做了相关的关联映射。一个目录表(category),一个文章表(article)。一个目录对应多个文章。我在页面上测试删除目录的时候发现我删除那些还未发布文章的目录可以删除成功,删除已经有文章的目录不成功(意料之内)。奇怪的地方出来了,当我先删除有文章的目录不成功后再去删除无文章的目录便出现了异常,导致不能成功删除。然后我重启tomcat,直接先删除无文章的目录。顺利删除。但只要我先删除已有文章的目录出现异常后再去删除无文章的目录就删除不成功。我想有一个可能解决方案就是对删除关联数据进行一下外键依赖处理。应该就不会出现这种情况。但是我想这应该不是最好的解决办法,因为我发现在第一次出现异常后再进行删除操作时hibernate的session值取不到了。我用的是sessionFactory session 删除方法:session.getCurrentSession().delete(session.getCurrentSession().get(category.class,id)); 可能有描述得不清晰的地方,希望各位能看看!谢谢! 问题补充:韩悠悠 写道

解决方案

Session执行一些sql语句把内存中的对象的状态同步到数据库,这个过程被称为session清理.在默认情况下,Session会在下面的时间点清理缓存。1 当应用程序调用net.sf.hibernate.Transacation的commit()方法的时候,commit()方法先清理缓存,然后再向数据库提交事务。 2 当应用程序调用Session的find()或者iterate()时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能反映持久化对象的最新状态。 3 当应用程序显示调用Session的flush()方法的时候。 注意Session的commit()和flush()方法的区别。flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务;commit()方法会先调用flush()方法,然后提交事务。提交事务意味着对数据库所做的更新被永久保存下来。执行session清理的顺序:1.按照应用程序调用session.save()方法的衔后顺序,执行所有对实进行插入的insert语句。2.执行所有对实体进行更新的update语句。3.执行所有对集合进行删除的delete语句。4.执行所有对集合元素进行删除、更新或者插入的SQL语句。5.执行所有对集合进行插入的insert语句。6.按照应用程序调用session.delete()方法的先后顺序,执行所有对实体进行删除的delete语句。Session的setFlushMode()方法用于设定清理缓存的时间点。FlushMode类定义了三种不同的清理模式:FlushMode.AUTO、FlushMode.COMMIT和FlushMode.NEVER。
解决方案二:
每次做完操作后,清理一下session,当你第一次执行操作的时候,hibernate已经把数据给你缓冲起来了,所以当你第二次在删除的时候,不过是有文章没文章他都会先去查看缓冲中有没有数据,显然是有数据,就报错了

时间: 2024-07-31 12:31:53

关于hibernate删除数据时出现的异常问题!的相关文章

ASP.net在gridview中删除数据时同时更新xml文件

asp.net|xml|数据 为了减少对数据库的访问,前台页面通常只对xml文件进行读取,但是更新数据库的时候需要同时更新xml文件,添加好办,但是删除的时候呢,下面的程序在gridview中删除数据的同时删除xml文件中对应的节点.xml文件的每个节点是一个图片新闻,包括图片和新闻页面的本地存储路径.   using System;using System.Collections;using System.ComponentModel;using System.Data;using Syste

GridView内置删除功能删除数据时如何处理外键异常?

问题描述 两个数据表:retailer存放销售商信息,contract存放销售合同信息.后者中的retailernum字段要引用到销售商的编号当我用GridView显示销售商列表,使用内置的删除功能删除某一个被销售合同引用到的销售商信息时系统就会出现错误,提示SqlException(0x80131904):DELETE语句与REFERENCE约束"FK_contract_retailer"冲突.我不打算使用级联删除,有没有办法捕捉这个异常并在页面上向用户提示不可删除该记录呢?求教!

急,.net程序删除文件时总是提示异常

问题描述 我写的一个文件删除应用程序,部分代码如下:picName=dt.Rows[i][0].ToString();//从数据库中得到文件名.FileInfofi=newFileInfo(Server.MapPath(pathname+picName));//创建FileInfo对象if(fi.Exists)fi.Delete();//如果文件存在就删除它!!运行后,总是报错,异常说是拒绝访问:ServerErrorin'/'Application.----------------------

java如何处理httpsqs中队列存放满了再取数据时导致的异常

问题描述 异常信息为:2015-01-0419:14:00,019-[HL]ERRORstartQuertz1_Worker-3org.quartz.core.JobRunShellorg.quartz.core.JobRunShell.run(JobRunShell.java:211)-JobDEFAULT.jobDetailthrewanunhandledException:org.springframework.scheduling.quartz.JobMethodInvocationFa

winfrom用treeview添加删除数据时,到底怎么选中节点?

问题描述 RT这是UI界面,可以读取数据库中的数据,但是添加删除都不行.说没选中节点.privatevoidbtnAdd_Click(objectsender,EventArgse){//新建txtNewCategoryNameif(bllCategory.CategoryNameIsExists(txtNewCategoryName.Text.Trim())){MessageBox.Show("该分类名称已存在,不能重复!","提示");}else{//非空判断,

hibernate 修改数据时,修改前的值与修改中的值的比较

问题描述 我现在要对某条记录进行修改,在Serivce中,从action中传递过来了记录的实体,如代码:public void saveResource(Resc resource) {//要进行分开,A->是新增资源,B->修改资源 两种情况在刷新缓存情况不同boolean isNew = (resource.getResourceId() == null);String path = "";resourceDao.getSession().clear();resourc

mysql中多表关联删除数据时同时删除关联数据

category(栏目信息表)和news(新闻数据表). category中的id(栏目编号)字段作为该表的主键(primary key).唯一标识了一个栏目的信息. news 中的id字段作为该表的主键(primary key).唯一标识了一个栏目的信息. category_id(栏目编号)字段与category表的id字段相关联. 1.SQL删除语句  代码如下 复制代码 sql = "delete category,news from category left join news on

在ASP.NET 2.0中操作数据之十六:概述插入、更新和删除数据_自学过程

导言 结束前面的几节,我们已经探讨过了如何使用GridView.DetailsView和FormView控件来显示数据.这些控件简单地操作提供给它的数据.一般地,这些控件通过使用一个数据源控件,例如ObjectDataSource来存取数据.我们已经看过了ObjectDataSource是如何在ASP.NET页面和潜在的数据之间扮演一个代理的角色.当一个GridView需要显示数据时,它调用ObjectDataSource的Select()方法,这个方法转而调用一个来自我们的业务逻辑层(BLL)

ASP.NET 2.0数据教程之十六: 概述插入、更新和删除数据

返回"ASP.NET 2.0数据教程目录" 导言 结束前面的几节,我们已经探讨过了如何使用GridView.DetailsView 和FormView控件来显示数据.这些控件简单地操作提供给它的数据.一般地,这 些控件通过使用一个数据源控件,例如ObjectDataSource来存取数据.我们已经 看过了ObjectDataSource是如何在ASP.NET页面和潜在的数据之间扮演一个代理的 角色.当一个GridView需要显示数据时,它调用ObjectDataSource的Selec