`

Hibernate3中 truncate运行时异常的解决方案

    博客分类:
  • db
阅读更多
在使用Hibernate3中,发现执回收表格(MySql表空间)时总是报错,具体如下:
我们回收一个表空间(删除表中所有数据,并回收空间),但Hibernate3中总是报错。这点上觉得Hibernate还真不如IbatiS稳定,这种常用的SQL方法居然都支持的不好。
代码如下:
try {
			tx = session.beginTransaction();
			session.createQuery("truncate UserVo").executeUpdate();
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
			e.printStackTrace();
		} finally {
			session.close();
		}

错误堆栈信息:
java.lang.IllegalArgumentException: node to traverse cannot be null!
	at org.hibernate.hql.ast.util.NodeTraverser.traverseDepthFirst(NodeTraverser.java:63)
	at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:280)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:182)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1770)
	at com.zakisoft.workspace.initcompt.hib.dao.MyHibernateDao.truncateUser(MyHibernateDao.java:193)
	at com.zakisoft.workspace.initcompt.hib.frame.TurncateUserPanel$1$1.run(TurncateUserPanel.java:49)

不过Hibernate还是有自己的解决方案,就是直接执行SQL。代码也很简单,就是利用session.createSQLQuery代替session.createQuery,完整方法如下:
try {
			tx = session.beginTransaction();
			session.createSQLQuery("truncate table user2").executeUpdate();
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
			e.printStackTrace();
		} finally {
			session.close();
		}

这里顺便说一下为什么使用truncate而不用delete
truncate会删除表中所有的数据,包括序列,同时回收表空间。当再插入数据时,序列号是1.
delete仅仅是删除数据,不删除序列,不回收空间。当再插入数据时,序列号是最后的序列号+1。
2
1
分享到:
评论

相关推荐

    sql中 truncate 和 delete 有什么区别

    "SQL中truncate和delete的区别" SQL中truncate和delete是两种不同的数据删除方式,它们之间存在许多关键的区别。本文将详细阐述truncate和delete的不同之处,以便读者更好地理解和选择这两种删除方式。 -delete的...

    smarty truncate中文乱码解决

    Smarty是一款广泛使用的PHP模板引擎,它允许开发者将HTML和PHP...通过以上方法,你应该能够成功解决Smarty中`truncate`处理中文字符串时的乱码问题。在实际开发中,对字符编码的理解和正确使用是避免此类问题的关键。

    oracle中truncate table后的数据恢复

    在Oracle数据库中,`TRUNCATE TABLE`是一个用于删除表中所有数据的命令,它与`DELETE`语句不同,不记录任何删除操作,并且在大多数情况下执行速度更快。然而,一旦执行`TRUNCATE TABLE`,数据通常无法通过常规的...

    ORACLE truncate 数据恢复

    在Oracle数据库中,`TRUNCATE TABLE`命令用于删除表中的所有数据,但它与`DELETE`语句有所不同。`TRUNCATE`操作是DDL(Data ...对于初学者,了解这些恢复方法可以帮助你在遇到问题时迅速找到解决方案,减少损失。

    数据库中truncate,delete,drop语句的比较

    ### 数据库中truncate、delete与drop语句的深入解析 #### 一、基本概念与应用场景 在数据库管理中,`truncate`、`delete`与`drop`是三种常见的SQL语句,它们各自拥有不同的功能与用途,对于初学者来说,区分这三种...

    TRUNCATE与 DELETE区别

    在数据库管理中,TRUNCATE 和 DELETE 是两种用于删除数据的方法,它们各有其特定的适用场景和优缺点。本文将详细对比分析这两种操作的区别。 首先,TRUNCATE TABLE 是一种快速删除表中所有数据的方式,它并不记录每...

    SQL中Truncate的用法

    本文导读:删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所有行,而不记录单个行删除操作。TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似;但是,TRUNCATE TABLE 速度更快,使用...

    MySQL中truncate误操作后的数据恢复案例

    实际线上的场景比较复杂,当时涉及了truncate, delete 两个操作,经确认丢数据差不多7万多行,等停下来时,差不多又有共计1万多行数据写入。 这里为了简单说明,只拿弄一个简单的业务场景举例。 测试环境: Percona-...

    oracle truncate恢复

    ### Oracle Truncate 操作及其恢复方法 在Oracle数据库管理中,`TRUNCATE`命令是一种高效的数据清除方式,常用于快速清空表中的...通过理解`TRUNCATE`的特点以及掌握正确的恢复策略,可以在遇到问题时有效地解决问题。

    truncate 表恢复

    `TRUNCATE`命令在Oracle数据库中用于快速清空表中的所有数据。与`DELETE`命令不同的是,`TRUNCATE`不触发任何触发器也不记录回滚信息,因此执行速度更快。具体来说,`TRUNCATE`操作的原理在于它**并不会逐个清除用户...

    truncate,delete,drop的异同点

    - **作用**:`TRUNCATE` 命令主要用于快速清空一个表中的所有数据,同时重置表中的自动增长字段。它不会删除表结构本身。 - **特点**: - **速度快**:由于 `TRUNCATE` 不记录日志信息,因此执行速度非常快。 - **...

    truncate,delete以及drop区别汇总

    ### truncate, delete 以及 drop 区别汇总 #### 一、概述 在数据库管理中,经常需要对数据表进行各种操作,比如删除表中的数据、删除整个表等。`truncate`, `delete` 和 `drop` 是三种常见的 SQL 命令,它们在功能...

    Oracle_授权审计表Truncate权限.docx

    Truncate 权限是指对审计表的 truncate 操作的权限,这个权限可以让用户删除审计表中的所有记录,从而清空审计表。Truncate 权限是非常危险的,因为它可以让攻击者删除所有的审计记录,掩盖自己的踪迹。 在 Oracle ...

    Truncate表恢复(无备份情况下)

    3. **确认表的状态**:查看表的状态,确保表已经被`TRUNCATE`。 ```sql SQL&gt;select count(*) from emp; COUNT(*) ---------- 0 ``` 4. **执行恢复操作**: - 定义变量:指定需要恢复的表所在的 schema 和...

    truncate表恢复

    在数据库管理中,"TRUNCATE"命令是一个用于删除表中所有数据的高效操作,它与"DELETE"命令相似但有所不同。"TRUNCATE"不记录单个行的删除,因此速度更快,同时也不触发与删除操作相关的任何触发器或回滚段。然而,这...

    Angular Truncate(一款灵活控制Angular字符串长度的js插件)

    Angular Truncate提供了一个优雅的解决方案,通过内置的过滤器(filter)功能,允许我们在不改变原始数据的情况下,根据需要控制显示的文本长度。 该插件的核心在于其提供的过滤器,它可以接受几个参数,以便定制...

    Laravel开发-crawl-truncate

    在Laravel框架中进行开发时,我们经常需要处理各种Web抓取(crawl)和SEO优化问题,特别是针对社交网络如Twitter或Facebook的爬虫。"Laravel开发-crawl-truncate"项目显然关注的是如何在这些特定爬虫访问时对页面源...

    前端开源库-truncate-html

    在前端开发中,有时我们需要对较长的HTML内容进行截断,以便在有限的空间内展示关键信息,例如在新闻摘要、博客列表或者评论区域等场景。`truncate-html` 是一个专门用于此目的的开源库,它允许我们在保持HTML结构...

Global site tag (gtag.js) - Google Analytics