一:Java工程环境介绍
(1) 工程目录结构
(2) Oracle9i + Oracle10g的驱动 + jdk1.4
(3) 用到的jar包如下:
(4) 数据库表结构
create table hibernate_lob
(
ID VARCHAR2(5) not null,
TITLE VARCHAR2(50),
CONTENT CLOB,
IMAGE BLOB
)
二:主要代码如下
(1) HibernateLob.java
package cn.com.victorysoft.vo;
public class HibernateLob {
private String id;
private String title;
private String content;
private byte[] image;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public byte[] getImage() {
return image;
}
public void setImage(byte[] image) {
this.image = image;
}
}
(2) HibernateLob.hbm.xml
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="cn.com.victorysoft.vo">
<class name="HibernateLob" table="HIBERNATE_LOB">
<id name="id" column="id" type="java.lang.String">
<generator class="sequence">
<param name="sequence">HIBERNATELOB_SQ</param>
</generator>
</id>
<property name="title" column="title" type="java.lang.String" />
<property name="content" column="content" type="org.springframework.orm.hibernate3.support.ClobStringType" />
<property name="image" column="image" type="org.springframework.orm.hibernate3.support.BlobByteArrayType" />
</class>
</hibernate-mapping>
(3) beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@localhost:1521:test</value>
</property>
<property name="username">
<value>test</value>
</property>
<property name="password">
<value>test</value>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="transactionManagerRootProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="proxyTargetClass">
<value>false</value>
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="select*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" lazy-init="true" />
<bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">
<property name="nativeJdbcExtractor">
<ref local="nativeJdbcExtractor" />
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="lobHandler" ref="oracleLobHandler"/>
<property name="mappingResources">
<list>
<value>
cn/com/victorysoft/vo/HibernateLob.hbm.xml
</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
<prop key="hibernate.show_sql">false</prop>
</props>
</property>
</bean>
<bean id="hibernateLobDAOSub" class="cn.com.victorysoft.dao.impl.HibernateLobImpl">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="hibernateLobDAO" parent="transactionManagerRootProxy">
<property name="target">
<ref bean="hibernateLobDAOSub" />
</property>
</bean>
</beans>
说明:如果不在事务环境下操作LOB字段,会报如下异常:
java.lang.IllegalStateException: Active Spring transaction synchronization or active JTA transaction with specified [javax.transaction.TransactionManager] required
(4) 测试类代码 MainTest.java
package cn.com.victorysoft.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.FileCopyUtils;
import cn.com.victorysoft.dao.IHibernateLobDAO;
import cn.com.victorysoft.vo.HibernateLob;
public class MainTest {
public static void main(String[] args) throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
IHibernateLobDAO hibernateLobDAO = (IHibernateLobDAO)ctx.getBean("hibernateLobDAO");
HibernateLob hLob = new HibernateLob();
hLob.setTitle("book1");
StringBuffer sb = new StringBuffer();
for(int i=0;i<1006;i++){
sb.append("a");
}
hLob.setContent(sb.toString());
File updateFile = new File("d:/dd.jpg");
FileInputStream updateFis = new FileInputStream(updateFile);
byte[] b = FileCopyUtils.copyToByteArray(updateFis);
updateFis.close();
hLob.setImage(b);
//插入对象
hibernateLobDAO.insertLob(hLob);
//查询对象
hLob = hibernateLobDAO.selectLobById("1");
//更新对象
hLob.setImage(b);
hibernateLobDAO.updateLob(hLob);
}
}