以下包括从网络上获取的内容和自己的一些理解,
可能存在不正确的地方,如遇到请指出,谢谢。
----------------------------------------------------------------SEPARATE-LINE----------------------------------------------------------------
万物起因
不允许的操作: streams type cannot be used in batching
operation not allowed: streams type cannot be used in batching
场景
Hibernate 2.1.4
将textarea中的值保存到Oracle的blob中,然后将blob保存的值显示在textarea中
http://www.iteye.com/problems/27144
当字节数超过一定大小时则出现如上的异常
BLOB指oracle.sql.BLOB,实现了java.sql.Blob
BlobImpl指hibernate.lob.BlobImpl,同样实现了java.sql.Blob
网上很多人都说将Hibernate的参数jdbc.batch_size的值设置为0即可解决问题
但我没有这么做
于是开始寻找解决办法
经典老帖"
使用JDBC和Hibernate来写入Blob型数据到Oracle中":http://www.iteye.com/topic/254
我的想法一般都比较简单string2blob和blob2string就应该能解决问题
这其中要通过字节数组byte[]来过渡
于是想应该将Blob转成BLOB然后通过getBytes方法就可以拿到bytes
blob强转为BLOB报
ClassCastException
Debug一看原来运行中的Blob是BlobImpl类型的
强转为BLOB当然产生ClassCastException
既然发现运行中的类型为BlobImpl,所以强转
因为看起来BlobImpl也有getBytes方法
if (true == blob instanceof BlobImpl) {
BlobImpl bb = (BlobImpl) blob;
bytes = bb.getBytes(0, (int) bb.length());
}
但无法调用BlobImpl.getBytes方法,出现如下异常
java.lang.UnsupportedOperationException: Blob may not be manipulated from creating session
还是
Google
原来Blob类型的只能用两个方法
https://forum.hibernate.org/viewtopic.php?t=933977
引用
As u can see out of the sourcecode, every method do nothing but:
Code:
throw new UnsupportedOperationException("Blob may not be manipulated from creating session");
The only to methods who are implemented really, are:
getBinaryStream()
length()
So use those instead of getBytes()
Why they used the text "Blob may not be manipulated" i can't say...
Maybe anybody can help us with that?
Greets
于是继续改代码
public static byte[] getBytes(Blob blob) throws SerialException,
IOException, SQLException {
if (null == blob || true != blob instanceof Blob)
throw new IllegalArgumentException("LOBUtil.getBytes方法无法接受你传入的参数:"
+ blob);
byte[] bytes = null;
if (true == blob instanceof BlobImpl) {
InputStream is = blob.getBinaryStream();
bytes = IOUtil.newInstance().getBytes(is);
} else if (true == blob instanceof BLOB) {
bytes = ((BLOB) blob).getBytes();
}
return bytes;
}
这样就应该没啥大问题了
分享到:
相关推荐
是一个js插件,可以给textarea的内容显示行号
jquery实现的关键字高亮插件,简单易用,连textarea中的关键字都可以高亮哦
fle中textarea控件中html文本显示与转换
Vue实现动态显示textarea剩余文字数量,具体内容如下 这里我们假设允许用户输入的最多数量为200个 html代码如下: <textarea maxlength="200" @input="descInput" v-model="desc" /> <span>{{remnant}}/200...
Textarea Autosize:根据内容的大小自动调整Textarea
最近开发的时候做了textarea 高亮关键字,尝试过很多方法,比如用iframe,和编辑器替换,当然这也是一个方法,但是原来是用textbox的内容要达到兼容这两种方法是做不到的,所以这里是使用jquery插件和jquery核心文件搞的...
textarea根据内容自适应高度 组件 注意:要监听input事件改变value值 使用: <autoheight_textarea value="{{value}}" placeholder="写个评论" bindinput="listenerinput"></autoheight_textarea>
VC实现向TextArea中写入内容(非COM方式)
在textarea中输入回车符 在js读取textarea中的值有\r\n然后到业务层转换到string中就有可能变成空格形式然后被存入数据库,当在取出此值的时候则会变成空格的形式,因此我们需要将不显示的\r\n替换一下。
为原始的HTML页面中的textarea框加入行号,替代一些复杂的文本编辑器
<textarea cols="每行中的字符数" rows="显示的行数"> 文本内容 </textarea> 描述 <textarea> 标记定义多行的文本输入控件。有两个比较重要的属性cols和rows, 语法格式 说明 属性 值 描述 cols number 规定文本区内...
vue结合html实时截取textarea文本,获取鼠标下标,截取自定义文本,不错的demo
css textarea textarea 样式
Vue自定义组件实现文本框根据文本内容自适应高度的效果,解决若输入文本量或显示文本量超过指定行数后,会出现垂直滚动条,但在IE环境下,该滚动条是隐藏的问题。
textarea剩余字数
解决Flex在非主应用程序中,textarea和input不能输入中文的 方法。
NULL 博文链接:https://diaoweili.iteye.com/blog/774179
里面包含了两个javascript方法,一个是判断终端类型的,根据userAgent判断访问网页的是什么类型的终端 第二个方法,是使textarea根据内容的多少,自动设置相应的高度,使文字不被隐藏
textarea光标定位在最后,就是往textarea中赋值时候,光标自动移到最后。
textarea 随内容高度固定,自动增宽;宽度固定,自动增高; 以及 wrap 的几种属性简介。