Sql Server触发器和hibernate一起使用时经常报类似如下错误

Batch update returned unexpected row count from update [0];

这个问题困扰了我半年,不止上面的错误还有其他类似的错误,半年内一直很郁闷,半年是什么概念真是晕倒,曾经也百度过但是没有解决方案,很多回答都是说hibernate和sqlserver 兼容不好,或者说程序是oo的不能用触发器,但这些都不是解决问题的方法,今天又遇到同事写的程序有这个问题,因为这个问题,我已经不将hibernate和sqlserver触发器一起使用了,但是遇到了就得解决,仔细分析这段话

Batch update returned unexpected row count from update [0];

批量保存失败,因为返回的行数和预期的不一样,从语意上来看hibernate做的是对的,因为如果只写一句session.update(u);hibernate是有理由做校验的,这时我在想如何能让hibernate感知不到触发器的工作,前几天写存储过程使用临时表的一个小技巧给了我提示.

前段时间我写个了针对存储过程的java调用封装

我把这段程序放到了实际项目中,但是我的同事在使用的时候却遇到了问题。如果存储过程中这样写

select * into #t from table

在java中利用我封装的类无法取得最后返回的结果集,起初我认为是我封装的程序有问题,后来查看了前人写的存储过程发现了线索,原来少了一句set nocount on,这句话起关键作用。

从单词上看,意思是不计数返回的行数,当时我还没有预见到这句话可以解决hibernate和触发器协作的问题,直到今天我突然联想到了这件事,因为这几天还一直在做数据库性能优化,set nocount on还可以起到性能优化的作用。

所以今天再次遇到hibernate和触发器冲突的问题时,我突然想到了set nocount on,有了这句话java程序就感知不到返回的行数了也自然谈不上unexpected的问题了。

至于hibernate和触发器一起工作的其他问题我目前还没发现有障碍性的,基本通过编程都可以解决,至于session同步,刷新就可以了。

为了说明问题还是发小段代码

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
Create TRIGGER [Syj_User_Triger] ON [dbo].[Syj_User]
FOR INSERT, UPDATE, DELETE
AS
set nocount on --不加这句话hibernate会报错,因为下面的update操作计数返回的值>1
update authors set state=state
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET NOCOUNT

最后看下sqlserver帮助里面的解释

SET NOCOUNT

使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。

语法

SET NOCOUNT { ON | OFF }

注释

当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。

即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。

当 SET NOCOUNT 为 ON 时,将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息。当使用 Microsoft® SQL Server™ 提供的实用工具执行查询时,在 Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DELETE)结束时将不会在查询结果中显示"nn rows affected"。

如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。

SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。

权限

SET NOCOUNT 权限默认授予所有用户。

示例

下例在 osql 实用工具或 SQL Server 查询分析器中执行时,可防止显示有关受影响的行数的信息。

USE pubs
GO
-- Display the count message.
SELECT au_lname
FROM authors
GO
USE pubs
GO
-- SET NOCOUNT to ON and no longer display the count message.
SET NOCOUNT ON
GO
SELECT au_lname
FROM authors
GO
-- Reset SET NOCOUNT to OFF.
SET NOCOUNT OFF
GO

让Hibernate和触发器协同工作的更多相关文章

  1. [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. Hibernate与数据库的触发器协同工作

    Hibernate 与数据库中的触发器协同工作时, 会造成两类问题 1触发器使 Session 的缓存中的持久化对象与数据库中对应的数据不一致:触发器运行在数据库中, 它执行的操作对 Session ...

  3. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. Hibernate之Session对象的相关方法以及持久化对象的状态

    一.持久化对象的状态        站在持久化的角度, Hibernate 把对象分为 4种状态: 持久化状态,临时状态,游离状态,删除状态.Session 的特定方法能使对象从一个状态转换到另一个状 ...

  5. Hibernate学习

    一.Hibernate与触发器协同工作 Hibernate与数据库中的触发器协同工作,会造成两类问题 ----触发器使Session的缓存中的持久化对象与数据库中对应的数据不一致:触发器运行在数据库中 ...

  6. JavaEE高级-Hibernate学习笔记

    *什么是Hibernate? > 一个框架 > 一个Java领域的持久层框架 > 一个ORM框架 *对象的持久化 > 狭义的理解:“持久化”仅仅指把对象永久保存到数据库中 &g ...

  7. 举例理解Hibernate的三种状态(转)

    转自:https://blog.csdn.net/yiguang_820/article/details/79073152 初学Hibernate,了解到Hibernate有三种状态:transien ...

  8. hibernate 初学

    1. hibernate的基本操作 执行流程: 执行流程细节:基本的配置文件         可以与mybatis进行对比着记                  hibernate 的主键生成策略   ...

  9. Hibernate4.x之Session--常用方法

    接上篇文章继续学习Hibernate的Session(http://www.cnblogs.com/dreamfree/p/4111777.html) 持久化对象的状态; 站在持久化的角度,Hiber ...

随机推荐

  1. ubuntu14.04安装telnet

    1.首先查看telnet运行状态 netstat -a | grep telnet 输出为空,表示没有开启该服务 2.安装openbsd-inetd apt-get install openbsd-i ...

  2. 第12课 std::bind和std::function(3)_std::function可调用对象包装器

    1. std::function (1)首先是一个类模板,用于包装可调用对象.可以容纳除了类成员(函数)指针之外的所有可调用对象. (2)可以将普通函数,lambda表达式和函数对象类统一起来.尽管它 ...

  3. delphi打开项目提示unable to find resource on dll projects

    用记事本打开*.dof文件, 把这行[Resource DLL Projects]及它的所属的内容删除就行了.

  4. DB通用类:Sqlite通用类库

    Sqlite通用类库 using System; using System.Collections; using System.Collections.Generic; using System.IO ...

  5. Web of Science API

    Web of Science API是通过Web Service获取Web of Science在线数据的应用程序接口,供各种编程语言调用.简单说,就是你能根据API实时.动态得到网页版Web of ...

  6. Solr——从postgresql数据库导入数据

    1,配置准备 本文的前提是你已经配置好了solr,并新创建了一个core,我们下面都会按照前一篇文章中的core_demo为基础开始 2,修改soreconfig.xml 在soreconfig.xm ...

  7. python-简单的sqlite3使用

    # 导入SQLite驱动: >>> import sqlite3 # 连接到SQLite数据库 # 数据库文件是test.db # 如果文件不存在,会自动在当前目录创建: >& ...

  8. 编码,基本数据类型,str索引和切片,for循环

    1. 编码 1. 最早的计算机编码是ASCII. 美国人创建的. 包含了英文字母(大写字母, 小写字母). 数字, 标点等特殊字符!@#$% 128个码位 2**7 在此基础上加了一位 2**8 8位 ...

  9. 【Eclipse】eclipse自动提示+自动补全

    解决代码的自动提示问题: 1.打开 Eclipse -> Window -> Perferences 2.找到Java 下的 Editor 下的 Content Assist , 右边出现 ...

  10. HANA私有云解决方案

        在移动互联网时代,不支持在云上的部署一定会落伍的,HANA作为SAP力推的技术,对云的支持也做的很不错,今天我们就来探讨一下HANA私有云解决方案,至于公有云或者混合云,思路也是大同小异了. ...