Hibernate + Spring 操作 Lob 详解

一:Java工程环境介绍 

 

(1) 工程目录结构

hibernate工程目录结构

(2) Oracle9i + Oracle10g的驱动 + jdk1.4

(3) 用到的jar包如下:

 

hibernatejar包

(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); 
 }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值