论坛首页 Java企业应用论坛

spring+hibernate对Clob的处理

浏览 4369 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-04-16  

     原来用的oracle 的vachar2 4000字节,感觉应该不小了,没想到没写几个字就完了,没办法,只有用oracle 的Clob了,可是怎么做了,上网查了好多,总结一下。。。

借用一下:

一、问题需求:

 1.在持久化类中字段该用什么类型?
 2.在Struts中文件对应的数据类型是什么?
 3.在Hibernate 中字段对应的类型是什么?
 4.如何在Spring 中处理这些文件?

二、解决:

    如果你用的是oracle 8 那就不用看了,因为下面的方法,好像行不通,你只能再接再励另找方法了!

    我的环境 oracle 10g 1.0.1,spring 1.2 ,hibernate 3.

 

1.持久类映射字段的类型:

    1.1 Blob 用byte[];

    1.2 Clob 用String;

2.Spring 配置文件:

 

	
       <!-- Oracle 9i 以上,oracle 10g 10.1.0.1以下 -->
       <bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" lazy-init="true"/>
	
       <!-- spring 的操作句柄 -->
	<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">
		<property name="nativeJdbcExtractor">
			<ref local="nativeJdbcExtractor"/>
		</property>
	</bean>

    2.1 往sessionFactory 中注入

	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="configLocation"
			value="classpath:hibernate.cfg.xml">
		</property>
		<!--把oracleLobHandler加入sessionFactory中  --> 
		<property name="lobHandler" ref="lobHandler"/>    	
	</bean>

 3. hibernate 配置

 

		<property name="content1" column="CONTENT1" 
		type="org.springframework.orm.hibernate3.support.ClobStringType" length="10000"/>

    注意:length 是字节

 

4.大功就快造成了。就差这么一步

	private String content1;
	public String getContent1() {
		return content1;
	}

	public void setContent1(String content1) {
		this.content1 = content1;
	}
 

就这样直接用吧,spring 把过程都写了,我们就透明着使用吧

 

 

PS:关于网上说的 oracle 10g 1.0.2.0以上版本可用ojdbc14.jar 保留意见!

 

 

   发表时间:2009-04-20  
    对不起啊,上面的解决方案有问题的。这个困扰我一天多的问题终于解决了,这是个惨痛的教训啊。
     废话少说,开始总结:
     1.换ojdbc14.jar oracle 最新的驱动 ,说说简单,说来也是,不过当你遇到什么”error1 :无法连接...“时可能也会烦恼: 上网查了,将myeclipe 下的eclipse.ini
原:
-showsplash
com.genuitec.myeclipse.product
--launcher.XXMaxPermSize
256m
-vmargs
-Xms128m
-Xmx512m
-Duser.language=en 
-XX:PermSize=128M 
-XX:MaxPermSize=256M
改成
-showsplash
com.genuitec.myeclipse.product
--launcher.XXMaxPermSize
256m
-vmargs
-Xms128m
-Xmx512m
-Duser.language=zh 
-XX:PermSize=128M 
-XX:MaxPermSize=256M


2.在映射文件中,将 clob 字段 映成 java.sql.Clob:
		<property name="content1" type="java.sql.Clob" update="true" insert="true">
			<column name="CONTENT1" />
		</property>

2.1持久类中
	
private Clob contentclob; 
private String contentStr;


2.2 关于保存: Hibernate DAO 中的代码
	public void saveClob(TmQuestion tmQuestion) {
		Session session=getHibernateTemplate().getSessionFactory().openSession();
		Transaction tran=session.beginTransaction();
		
		tmQuestion.setContentclob(Hibernate.createClob(" "));
		
		session.update(tmQuestion);
		
		session.flush();

		session.refresh(tmQuestion,LockMode.UPGRADE);
		
		SerializableClob  sc= (SerializableClob)tmQuestion.getContentclob();
		Clob wrapclob = sc.getWrappedClob();
		CLOB clob = (CLOB)wrapclob;
		
/*		CLOB clob = (CLOB) bbsRoot.getContent1();//error
*/        Writer out;
		try {
			Writer characterOutputStream = clob.getCharacterOutputStream();
			out = characterOutputStream;
//	        out.write(bbsRoot.getContent1Str());
			out.write(tmQuestion.getContentStr());
			out.close();
			tran.commit();
			session.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println(e.toString());
		}		
	}


2.3 读Clob
			Clob clob = tmQuestion.getContentclob();// 取得Clob的值
			if (clob != null) {
				String clobString = "";
				try {
					clobString = clob.getSubString(1, (int) clob.length());// 将Clob类型的值转换成String类型的值
					tmQuestion.setContentStr(clobString);// 通过setter方法,设置String值,然后就可以通过instance.getInfoContentToString()来取值了
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			return tmQuestion;


0 请登录后投票
   发表时间:2009-04-20  
太麻烦了。Hibernate已经自己解决了Clob的问题,可以直接使用String进行映射。而且配置文件里也只需要写几句话。具体你可以参考我的博客文章
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics