用户登录
用户注册

分享至

hibernate lobhandler

  • 作者: 横看成岭没双峰
  • 来源: 51数据库
  • 2020-10-24
在spring中采用OracleLobHandler来处理oracle大字段(包括clob和blob),则在程序中不需要引用oracle的特殊类,从而能够保证支持代码支持多数据库。

在Spring的主配置文件xx.xml中的配置SessionFactory的bean中配置:









...





...



nativeJdbcExtractor和 lobHandler 设置为 lazy-init="true",
因为 nativeJdbcExtractor需要通过运行期的反射机制获取底层的 JDBC 对象,
所以需要避免在 Spring 容器启动时就实例化这两个 Bean。

<注:上面的swssessionfactorybean是被重写过的,继承annotationsessionfactorybean>

1、首先数据表中的clob类型对应java持久化类的String类型;而blob类型对应byte[]类型
2、1.定义
hibernate标签时,持久化类中对应clob类型的属性的hibernate
type应为org.springframework.orm.hibernate.support.ClobStringType;而对应blob类型
的属性的hibernate
type应为org.springframework.orm.hibernate.support.BlobByteArrayType。

2.如果通过spring 注解功能配置PoJo类时,在该大字段属性的getXXX()方法前面加上注解:

public String xxx;

...

@Lob
@Type(type="org.springframework.orm.hibernate3.support.ClobStringType")
@Column(length=10000)
public String getXXX ()
{
return xxx;
}



  hibernate配置方法:

java代码:
public void update(DocumentData obj, String value)
throws HibernateException, Exception
{
Session s = null;
Writer out = null;
try
{
s = getSession();
s.flush();
Transaction tx = s.beginTransaction();
s.refresh(obj, LockMode.UPGRADE);//锁定更新记录;
CLOB clob = (CLOB) obj.getTextValue();
if (clob != null)
{
out = clob.getCharacterOutputStream();
out.write(value);
out.flush();//刷新内容,同步session和数据库内容。
out.close();
} else
{
obj.setTextValue(Hibernate.createClob(value == null ? ""
: value));
}
tx.commit();
} finally
{
if (null != s)
{
s.close();
}
if (out != null)
{
out.close();
}
}
}

public void insert(DocumentData obj)
throws HibernateException, Exception
{
Transaction t = null;
Session s = null;
try {
s = getSession();
t = s.beginTransaction();
s.save(obj);//obj对象包含Clob属性内容,可以直接insert
t.commit();
}
catch (HibernateException e) {
if (null != t) t.rollback();
throw e;
}
finally {
if (null != s) s.close();
}
}



  配置方式:
再hibernate.cfg.xml中加入属性配置
< property="" name="hibernate.connection.SetBigStringTryClob">true

然后实体中,只要字段类型为String就行

Annotation配置方式(JPA方式)
使用String 为字段类型,然后配置@Clod

附带: blod类型
用byte[] 为类型,然后配置 @Blod注解



  升级ojdbc驱动(问题依旧),我使用的驱动为ojdbc14.jar和ojdbc6.jar
增加hibernate全局配置:hibernate.jdbc.use_streams_for_binary=true
增加hibernate的type注解:@type(type="org.hibernate.type.materializedclobtype")



  通过SPRING的处理方法。 你也可以在页面将前台传过来的FILE类型转换成: clob类型的,Hibernate.createClob(参数)即可插入。你可以看我的百度博客的第一篇文章,我最近在公司上传时也同样遇到了麻烦。如有不明白,可以追问或给我留言



  好像以前我也碰到过类似的问题,那时候好像是在插入一个空值后再update来解决的。。。比较土。。。求高人解答。
软件
前端设计
程序设计
Java相关