|
Hibernate 为处理特殊数据类型字段定义了一个接口:org.hibernate.usertype.UserType。Spring 在 org.springframework.orm.hibernate3.support 包中为 BLOB 和 CLOB 类型提供了几个 UserType 的实现类。因此,我们可以在 Hibernate 的映射文件中直接使用这两个实现类轻松处理 LOB 类型的数据。
BlobByteArrayType:将 BLOB 数据映射为byte[]类型的属性;BlobStringType:将 BLOB 数据映射为String类型的属性;BlobSerializableType:将 BLOB 数据映射为Serializable类型的属性;ClobStringType:将 CLOB 数据映射为String类型的属性;
下面我们使用 Spring 的 UserType 为 Post 配置 Hibernate 的映射文件,如 清单 10 所示:
清单 10 . LOB 数据映射配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true" default-lazy="false">
<class name="com.baobaotao.domain.Post" table="t_post">
<id name="postId" column="post_id">
<generator class="identity" />
</id>
<property name="userId" column="user_id"/>
<property name="postText" column="post_text"
type="org.springframework.orm.hibernate3.support.ClobStringType"/>①对应 CLOB 字段
<property name="postAttach" column="post_attach"
type="org.springframework.orm.hibernate3.support.BlobByteArrayType"/>② BLOB 字段
<property name="postTime" column="post_time" type="date" />
<many-to-one name="topic" column="topic_id" class="com.baobaotao.domain.Topic" />
</class>
</hibernate-mapping>
|
postText 为 String 类型的属性,对应数据库的 CLOB 类型,而 postAttach 为 byte[] 类型的属性,对应数据库的 BLOB 类型。分别使用 Spring 所提供的相应 UserType 实现类进行配置,如 ① 和 ② 处所示。
在配置好映射文件后,还需要在 Spring 配置文件中定义 LOB 数据处理器,让 SessionFactory 拥有处理 LOB 数据的能力:
清单 11 . 将 LobHandler 注入到 SessionFactory 中
…
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"
lazy-init="true" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="lobHandler" ref="lobHandler" /> ① 设置 LOB 处理器
…
</bean>
|
在一般的数据库(如 DB2)中,仅需要简单地使用 HibernateTemplate#save(Object entity) 等方法就可以正确的保存 LOB 数据了。如果是 Oracle 9i 数据库,还需要配置一个本地 JDBC 抽取器,并使用特定的 LobHandler 实现类,如 清单 4 所示。
使用 LobHandler 操作 LOB 数据时,需要在事务环境下才能工作,所以必须事先配置事务管理器,否则会抛出异常。