SSHのblobへのサポート


先ほど一つの写真をデータベースに保存する問題を解決しました.記録を残して調べます.
1、主な手順
1.1ヒベルナの配置:
1.1.1、hibernateを配置する持久類ファイルで対応するフィールドはbyte[]タイプです.
1.1.2、hibernateを配置するクラスマッピングファイルに対応するフィールドtypeは 
     org.springfraamework.orm.hibernate 3.support.BlobytearrayType
1.2、springの配置:
1.2.1、native JdbcExtractorを配置すると、以下のようになります.  
    
1.2.2、配置oracleLobHandler
                          
            

1.2.3、oracleLobHandlerをsession Factoryに加える:
             
     2、ソースコード
2.1.1、テーブル_test_イメージ

create table TABLE_TEST_IMAGE
(
  ID  VARCHAR2(40),
  FID VARCHAR2(40),
  IMG BLOB
)
2.1.2、Image.java

package ie.search.test.model;

public class Image {
	private String id;
	private String fid;
	private byte[] img;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getFid() {
		return fid;
	}
	public void setFid(String fid) {
		this.fid = fid;
	}
	public byte[] getImg() {
		return img;
	}
	public void setImg(byte[] img) {
		this.img = img;
	}
}
2.1.3、Image.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">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="ie.search.test.model.Image" table="TABLE_TEST_IMAGE" >
        <id name="id" type="java.lang.String">
            <column name="ID" length="40" />
              <generator class="sequence"> 
                <param name="sequence">SEQ_TEST_IMAGE</param> 
              </generator>
        </id>
        
         <property name="fid" type="string">
            <column name="FID" length="40">
                <comment>  </comment>
            </column>
        </property>
        
        <property name="img" type="org.springframework.orm.hibernate3.support.BlobByteArrayType">
            <column name="IMG" >
                <comment>  </comment>
            </column>
        </property>
     
    </class>
</hibernate-mapping>
2.1.4、springプロファイルセグメント

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
	
	<!-- for Oracle9i ojdbc14.jar     -->
	<bean id="nativeJdbcExtractor" lazy-init="true" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"/>
	<bean id="lobHandler" lazy-init="true"   class="org.springframework.jdbc.support.lob.OracleLobHandler">
	        <property name="nativeJdbcExtractor">
	            <ref bean="nativeJdbcExtractor"/>
	        </property>
	</bean> 
	<!-- Oracle9i over -->
	
	<!-- for Oracle10g ojdbc14.jar    -->
	<!--
	<bean id="lobHandler" lazy-init="true"   class="org.springframework.jdbc.support.lob.DefaultLobHandler">
	</bean> 
	-->
	<!-- Oracle10g over -->
	
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />	
		<property name="lobHandler" ref="lobHandler"/>
		<property name="mappingDirectoryLocations">
			<list>
				<value>classpath*:ie/bsp/modules/commonquery/model/</value>
				<value>classpath*:ie/bsp/modules/reference/model/</value>
				<value>classpath*:ie/bsp/modules/commcomponent/model/</value>
				<value>classpath*:ie/bsp/modules/zone/model/</value>				
				<value>classpath*:ie/search/feature/featureTick/model/</value>
				<value>classpath*:ie/search/feature/featureMosquito/model/</value>
				<value>classpath*:ie/search/vector/tick/model/</value>
				<value>classpath*:ie/search/feature/featureMouse/model/</value>
				<value>classpath*:ie/search/feature/featureFlea/model/</value>
				<value>classpath*:ie/perm/model/</value>

				

				
			</list>
		</property>

		<property name="hibernateProperties">

			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
				<prop key="hibernate.cache.use_query_cache">true</prop>
				
			</props>
		</property>


	</bean>
	</beans>

2.1.5、アクセス画像のactionコードセグメント

public String saveImage(){
		FileInputStream fis=null;
		Image image=new Image();
		image.setFid("1");
		byte[] img=null;
		try {
			File f=new File("d:\\upload\\-1.jpg");
			fis=new FileInputStream(f);
			byte[] b=new byte[fis.available()];
			fis.read(b);
			fis.close();
			img=b;
			image.setImg(img);
			imageDao.save2(image);
		} catch (Exception e) {
			e.printStackTrace();
		}
		imageDao.save2(image);
		return "success";
	}

	public String readImage(){
		System.out.println(this.getClass()+".readImage()...");
		Image image=imageDao.get("21");
		FileOutputStream fos=null;
		try {
			fos=new FileOutputStream("d:\\upload\\target1.jpg");
			fos.write(image.getImg());
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "success";
	}
3、注意
<bean id=「native JdbcExtractor」/>
C 3 P 0 NativeJdbcExtractorを使用しました.
dpcp接続池なら、Commons DbcpNativeJdbcExtractorを使います.
接続池を使用していない場合:Simple NativeJdbcExtractor
その他、jboss、weblogic接続池などを使った場合は、専用のExtractorが対応します.