在ssh项目中有一个需要上传、下载的功能,并且将图片信息存在数据库字段中,表的信息如下:
1.[color=red][size=medium]表service_domain_audit_change(oracle中)[/size][/color]
字段 类型
[color=red][size=medium]表service_domain_audit_change(mysql中)
[/size][/color]
字段 类型
2.hibernate的配置文件如下:
主要截取了大字段类型:
3.[color=red][size=medium]Oracle中dao配置[/size][/color]
[color=red][size=medium]mysql中dao配置[/size][/color]
具体说明如下:
当时做mysql数据库的时候我就直接把oracle数据库的配置文件考过去了,本功能没有问题,在另外一个功能的时候出现了异常org.springframework.dao.InvalidDataAccessApiUsageException: OracleLobCreator needs to work on [oracle.jdbc.OracleConnection], not on [com.mysql.jdbc.Connection]: specify a corresponding NativeJdbcExtractor; nested exception is java.lang.ClassCastException: com.mysql.jdbc.Connection
Caused by:
java.lang.ClassCastException: com.mysql.jdbc.Connection
mysql数据库中已经配置过<bean id="lobHandler" lazy-init="true" class="org.springframework.jdbc.support.lob.DefaultLobHandler" />
估计是到那个功能的时候她不知道找那个lobHandler了。
在 Hibernate 中操作 LOB 数据
提示
使用 Spring JDBC 时,我们除了可以按 byte[]、String 类型处理 LOB 数据外,还可以使用流的方式操作 LOB 数据,当 LOB 数据体积较大时,流操作是唯一可行的方式。可惜,Spring 并未提供以流方式操作 LOB 数据的 UserType(记得 Spring 开发组成员认为在实现上存在难度)。不过,www.atlassian.com 替 Spring 完成了这件难事,读者可以通过 这里 了解到这个满足要求的 BlobInputStream 类型。
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 类型的属性;
[color=red][size=medium]
一些参考文章:[/size][/color]
1.Spring 让 LOB 数据操作变得简单易行
2.Struts+Spring+Hibernate浅见
3.解决websphere使用LobHandler写LOB字段的很迷惑人的错误
4.我曾经遇到的问题-请教SSH中Clob类型字段不能使用hibernate二级缓存的问题
5.Hibernate+Spring搞定Clob、Blob的存取
1.[color=red][size=medium]表service_domain_audit_change(oracle中)[/size][/color]
字段 类型
ID NUMBER(11)
SERVICE_CODE VARCHAR2(100)
DOMAIN_NAME VARCHAR2(1000)
AGENT_CODE VARCHAR2(100)
NEW_ORGANIZE_NAME_CN VARCHAR2(200)
NEW_USER_NAME_CN VARCHAR2(200)
TRANSFER_DATE TIMESTAMP(6)
CHECK_DATE TIMESTAMP(6)
STATE VARCHAR2(10)
CHECK_OPERATOR VARCHAR2(200)
EXT1 VARCHAR2(2000)
EXT2 VARCHAR2(2000)
EXT3 VARCHAR2(2000)
APPLY_TABLE BLOB
OLD_ ORGANIZE_IDENTITY BLOB
OLD_ USER _IDENTITY BLOB
NEW_ ORGANIZE_IDENTITY BLOB
NEW_ USER _IDENTITY BLOB
OTHER_INFOS BLOB
[color=red][size=medium]表service_domain_audit_change(mysql中)
[/size][/color]
字段 类型
ID bigint(11)
SERVICE_CODE VARCHAR(100)
DOMAIN_NAME VARCHAR(1000)
AGENT_CODE VARCHAR(100)
NEW_ORGANIZE_NAME_CN VARCHAR(200)
NEW_USER_NAME_CN VARCHAR(200)
TRANSFER_DATE TIMESTAMP
CHECK_DATE TIMESTAMP
STATE VARCHAR(10)
CHECK_OPERATOR VARCHAR(200)
EXT1 VARCHAR(2000)
EXT2 VARCHAR(2000)
EXT3 VARCHAR(2000)
APPLY_TABLE MEDIUMBLOB
OLD_ ORGANIZE_IDENTITY MEDIUMBLOB
OLD_ USER _IDENTITY MEDIUMBLOB
NEW_ ORGANIZE_IDENTITY MEDIUMBLOB
NEW_ USER _IDENTITY MEDIUMBLOB
OTHER_INFOS MEDIUMBLOB
2.hibernate的配置文件如下:
主要截取了大字段类型:
<property name="applyTable" type="org.springframework.orm.hibernate3.support.BlobByteArrayType">
<column name="apply_table"></column>
</property>
<property name="oldOrganizeIdentity" type="org.springframework.orm.hibernate3.support.BlobByteArrayType">
<column name="OLD_ORGANIZE_IDENTITY"></column>
</property>
<property name="oldUserIdentity" type="org.springframework.orm.hibernate3.support.BlobByteArrayType">
<column name="OLD_USER_IDENTITY"></column>
</property>
<property name="newOrganizeIdentity" type="org.springframework.orm.hibernate3.support.BlobByteArrayType">
<column name="NEW_ORGANIZE_IDENTITY"></column>
</property>
<property name="newUserIdentity" type="org.springframework.orm.hibernate3.support.BlobByteArrayType">
<column name="NEW_USER_IDENTITY"></column>
</property>
<property name="otherInfos" type="org.springframework.orm.hibernate3.support.BlobByteArrayType">
<column name="OTHER_INFOS"></column>
</property>
3.[color=red][size=medium]Oracle中dao配置[/size][/color]
<bean id="nativeJdbcExtractor" lazy-init="true" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"/> <!--设置本地 Jdbc 对象抽取器-->
<bean id="lobHandler" lazy-init="true" class="org.springframework.jdbc.support.lob.OracleLobHandler">
<property name="nativeJdbcExtractor">
<ref bean="nativeJdbcExtractor"/>
</property>
</bean> <!--设置 LOB 处理器-->
<bean id="domainAuditChangeDao" class="com.tangtang.domainAuditChange.dao.impl.DomainAuditChangeDaoImpl" />
[color=red][size=medium]mysql中dao配置[/size][/color]
<!--设置 LOB 处理器-->
<bean id="lobHandler" lazy-init="true" class="org.springframework.jdbc.support.lob.DefaultLobHandler" />
<bean id="domainAuditChangeDao" class="com.tangtang.domainAuditChange.dao.impl.DomainAuditChangeDaoImpl" />
具体说明如下:
大家可能已经注意到 nativeJdbcExtractor 和 oracleLobHandler Bean 都设置为 lazy-init="true",这是因为 nativeJdbcExtractor 需要通过运行期的反射机制获取底层的 JDBC 对象,所以需要避免在 Spring 容器启动时就实例化这两个 Bean。
LobHandler 需要访问本地 JDBC 对象,这一任务委托给 NativeJdbcExtractor Bean 来完成,因此我们在 ① 处为 LobHandler 注入了一个 nativeJdbcExtractor。最后,我们把 lobHandler Bean 注入到需要进行 LOB 数据访问操作的 PostJdbcDao 中,如 ② 所示。
如果底层数据库是 DB2、SQL Server、MySQL 等非 Oracle 的其它数据库,则只要简单配置一个 DefaultLobHandler 就可以了.
当时做mysql数据库的时候我就直接把oracle数据库的配置文件考过去了,本功能没有问题,在另外一个功能的时候出现了异常org.springframework.dao.InvalidDataAccessApiUsageException: OracleLobCreator needs to work on [oracle.jdbc.OracleConnection], not on [com.mysql.jdbc.Connection]: specify a corresponding NativeJdbcExtractor; nested exception is java.lang.ClassCastException: com.mysql.jdbc.Connection
Caused by:
java.lang.ClassCastException: com.mysql.jdbc.Connection
mysql数据库中已经配置过<bean id="lobHandler" lazy-init="true" class="org.springframework.jdbc.support.lob.DefaultLobHandler" />
估计是到那个功能的时候她不知道找那个lobHandler了。
在 Hibernate 中操作 LOB 数据
提示
使用 Spring JDBC 时,我们除了可以按 byte[]、String 类型处理 LOB 数据外,还可以使用流的方式操作 LOB 数据,当 LOB 数据体积较大时,流操作是唯一可行的方式。可惜,Spring 并未提供以流方式操作 LOB 数据的 UserType(记得 Spring 开发组成员认为在实现上存在难度)。不过,www.atlassian.com 替 Spring 完成了这件难事,读者可以通过 这里 了解到这个满足要求的 BlobInputStream 类型。
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 类型的属性;
[color=red][size=medium]
一些参考文章:[/size][/color]
1.Spring 让 LOB 数据操作变得简单易行
2.Struts+Spring+Hibernate浅见
3.解决websphere使用LobHandler写LOB字段的很迷惑人的错误
4.我曾经遇到的问题-请教SSH中Clob类型字段不能使用hibernate二级缓存的问题
5.Hibernate+Spring搞定Clob、Blob的存取