九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
解決:Weblogic容器、SSH框架下Hibernate映射Oracle XMLType方法與Jar包沖突

一、框架背景

      1、開發(fā)工具  MyEclipse 10 Pro

      2、框架使用 Struts2.3,Hibernate3,Spring3.0.5 (標準SSH框架)

      3、版本管理 svn 1.6 插件,visual svn 版本管理工具

      4、數(shù) 據(jù)  庫 Oracle 11g R2

二、Oracle XMLType

      引用Oracle官網(wǎng)對于Oracle的XMLType的部分解釋


      XMLType is a system-defined opaque type for handling XML data. It as predefined member functions on it to extract XML nodes and fragments.
      You can create columns of XMLType and insert XML documents into it. You can also generate XML documents as XMLType instances dynamically using the SYS_XMLGEN and SYS_XMLAGG SQL functions.



        Oracle XMLType的本質是blob類型,但是Oracle對其做了特殊處理,我們可以直接使用Xquery進行相關的創(chuàng)建、查詢、修改等操作,非常的利民。

三、Hibernate映射Oracle XMLType

      Hibernate可以映射Oracle 的 XMLType,默認的是String類型,也可以改成Text類型。

      如下所示,字段STORAGE_DETAIL_XML是一個Oracle的XMLType類型字段,Hibernate映射的時候自動映射成String

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  4. <!--  
  5.     Mapping file autogenerated by MyEclipse Persistence Tools 
  6. -->  
  7. <hibernate-mapping>  
  8.     <class name="com.CDSS.main.model.DatasourceStorage" table="DATASOURCE_STORAGE" schema="DBCDSS">  
  9.         <id name="storageId" type="java.lang.Long">  
  10.             <column name="STORAGE_ID" precision="22" scale="0" />  
  11.             <generator class="native">  
  12.                 <param name="sequence">SEQUENCE_DSS</param>  
  13.             </generator>  
  14.         </id>  
  15.         <property name="dsId" type="java.lang.Long">  
  16.             <column name="DS_ID" precision="22" scale="0" />  
  17.         </property>  
  18.         <property name="storageDetailXml" type="java.lang.String">  
  19.             <column name="STORAGE_DETAIL_XML" />  
  20.         </property>  
  21.         <property name="isReged" type="java.lang.String">  
  22.             <column name="IS_REGED" />  
  23.         </property>  
  24.     </class>  
  25. </hibernate-mapping>  

四、問題原由

      Hibernate可以映射Oracle 的 XMLType,默認的是String類型,其實正常情況下沒有多少問題,但是XMLType是一個繼承了blob的強大存在,應該可以存儲2G的數(shù)據(jù),可以如果你按照clob來進行處理的話,Hibernate就會報錯。

      引用我在BBS上發(fā)布的問題貼,到現(xiàn)在還是沒有人能解決。(傷心中.....)


4.1、在使用 ***DAO.save(*) 或者 ***DAO.merge(*)的時候會出現(xiàn)問題。問題原因我也知道
4.2、當字段dssXMLInfo的數(shù)據(jù)大小在4000字符以下的時候,可以正常保存或者merge
4.3、當字段dssXMLInfo的數(shù)據(jù)超過4000字符的時候,直接報【Long列插入Long值】類似的錯誤
4.4、參考網(wǎng)上知道,當String的字符超過4000的時候,Hibernate會自動把String轉換成Long類型,網(wǎng)上的建議是把varchar改成clob或者blob【此法不通,不符合我的要求】
4.5、參考網(wǎng)上知道,Hibernate處理Oracle的xmlType的時候,多數(shù)自定義一個映射數(shù)據(jù)類型,然后把hibernate配置文件中的type="String" 換成對應的 type="類的包名"【參考URL:廣東精鷹軟件工作室(劉正仁)http://blog.csdn.net/wmbb/article/details/1045742】
    但是這個需要引入3個包,分別是xmlparserv2.jar 、xdb.jar和nls_charset12.jar,這三個包和我現(xiàn)有的weblogic自帶包、Java環(huán)境(使用Weblogic自帶的jdk1.6)發(fā)生沖突,啟動會報【XML解析錯】的錯誤。
    之前的項目中也使用這個方法解決問題的,但是部署系統(tǒng)的時候需要先把這幾個包刪除了才可以啟動,非常的不方便,而且操作十分麻煩?!竟识艞壛恕?br>4.6、今天又做了一次嘗試,直接使用sql語句,使用hibernate的sql數(shù)據(jù)提交。問題同樣也是字符超長,無法執(zhí)行?!緡L試了一晚上,沒有成功,故而崩潰】


        上面描述的其實是一個問題,當數(shù)據(jù)超過4000字符的時候,直接報【Long列插入Long值】類似的錯誤。這個問題是Hibernate看見更新String類型數(shù)據(jù),哇塞好大,那么就給你轉成Long吧。很腦抽的現(xiàn)象.....糾結了好久。

五、解決方案

      Hibernate映射Oracle XMLType在網(wǎng)上有諸多版本,但是這些版本要不是Oracle版本較低(Oracle 9i),要不是Hibernate版本過高(Hibernate4),還有就是不是為Weblogic考慮的(使用jboss、tomcat等),因此拿過來很多東西都是錯誤的。


      參考網(wǎng)上諸多解決方案,經(jīng)過好幾天的測試、處理,終于找打一個這中的解決方案,測試通過。(只針對第一章所講的環(huán)境,其它未測試)


5.1 系統(tǒng)添加幾個jar包

(1)ojdbc6_g.jar(從Oracle11g安裝目錄中找)【部署后刪除,weblogic自帶此包,項目中使用是因為需要相關的驅動】

(2)xmlparserv2.jar(從Oracle11g安裝目錄中找)【部署后刪除,此文件和其它jar沖突,原因未知,啟動成功后建議還原

(3)xdb.jar(從網(wǎng)上下載)

(4)weblogic.jar(從weblogic安裝路徑下找)【部署后刪除,weblogic自帶此包,項目中使用是因為需要相關的驅動】


5.2 新建自定義的OracleType,繼承UserType, Serializable。

  1. package com.***.util.XMLHandle;  
  2.   
  3. import java.io.Serializable;  
  4. import java.sql.Connection;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.ResultSet;  
  7. import java.sql.SQLException;  
  8.   
  9. import oracle.sql.OPAQUE;  
  10. import oracle.xdb.XMLType;  
  11.   
  12. import org.hibernate.HibernateException;  
  13. import org.hibernate.usertype.UserType;  
  14.   
  15. import weblogic.jdbc.wrapper.PoolConnection;  
  16.   
  17. @SuppressWarnings("rawtypes")  
  18. public class OracleXMLType implements UserType, Serializable {  
  19.     /** 
  20.      *  
  21.      */  
  22.     private static final long serialVersionUID = 1L;  
  23.     private static final Class returnedClass = String.class;  
  24.     private static final int[] SQL_TYPES = new int[] { oracle.xdb.XMLType._SQL_TYPECODE };  
  25.   
  26.     public int[] sqlTypes() {  
  27.         return SQL_TYPES;  
  28.     }  
  29.   
  30.     public Class returnedClass() {  
  31.         return returnedClass;  
  32.     }  
  33.   
  34.     public boolean equals(Object arg0, Object arg1) throws HibernateException {  
  35.         if (arg0 == null || arg1 == null) {  
  36.             throw new HibernateException("None of the arguments can be null.");  
  37.         }  
  38.         if (arg0 instanceof oracle.xdb.XMLType  
  39.                 && arg1 instanceof oracle.xdb.XMLType) {  
  40.             return arg0.equals(arg1);  
  41.         }  
  42.         return false;  
  43.     }  
  44.   
  45.     public int hashCode(Object arg0) throws HibernateException {  
  46.         return 0;  
  47.     }  
  48.   
  49.     public Object nullSafeGet(ResultSet rs, String[] names, Object arg2)  
  50.             throws HibernateException, SQLException {  
  51.   
  52.         OPAQUE op = (OPAQUE) rs.getObject(names[0]);  
  53.         oracle.xdb.XMLType xt = oracle.xdb.XMLType.createXML(op);  
  54.         return xt.getStringVal();  
  55.     }  
  56.   
  57.     public void nullSafeSet(PreparedStatement st, Object value, int index)  
  58.             throws HibernateException, SQLException {  
  59.   
  60.         Connection conn = ((PoolConnection) st.getConnection())  
  61.                 .getVendorConnection();  
  62.   
  63.         OPAQUE aClob = XMLType.createXML(conn, (String) value);  
  64.     //  XMLType aClob = XMLType.createXML(conn, (String) value);  
  65.         st.setObject(index, aClob);  
  66.   
  67.     }  
  68.   
  69.     public Object deepCopy(Object value) throws HibernateException {  
  70.         return value;  
  71.     }  
  72.   
  73.     public boolean isMutable() {  
  74.         return false;  
  75.     }  
  76.   
  77.     public Serializable disassemble(Object arg0) throws HibernateException {  
  78.         return null;  
  79.     }  
  80.   
  81.     public Object assemble(Serializable arg0, Object arg1)  
  82.             throws HibernateException {  
  83.         return null;  
  84.     }  
  85.   
  86.     public Object replace(Object arg0, Object arg1, Object arg2)  
  87.             throws HibernateException {  
  88.         return null;  
  89.     }  
  90. }  

5.3 修改Hibernate映射文件,把type="string"換成type="com.CDSS.util.XMLHandle.OracleXMLType"【你定義的類】

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  4. <!--  
  5.     Mapping file autogenerated by MyEclipse Persistence Tools 
  6. -->  
  7. <hibernate-mapping>  
  8.     <class name="com.CDSS.main.model.DatasourceStorage" table="DATASOURCE_STORAGE" schema="DBCDSS">  
  9.         <id name="storageId" type="java.lang.Long">  
  10.             <column name="STORAGE_ID" precision="22" scale="0" />  
  11.             <generator class="native">  
  12.                 <param name="sequence">SEQUENCE_DSS</param>  
  13.             </generator>  
  14.         </id>  
  15.         <property name="dsId" type="java.lang.Long">  
  16.             <column name="DS_ID" precision="22" scale="0" />  
  17.         </property>  
  18.         <property name="storageDetailXml" type="com.CDSS.util.XMLHandle.OracleXMLType">  
  19.             <column name="STORAGE_DETAIL_XML" />  
  20.         </property>  
  21.         <property name="isReged" type="java.lang.String">  
  22.             <column name="IS_REGED" />  
  23.         </property>  
  24.     </class>  
  25. </hibernate-mapping>  
5.4、其它不變,然后部署,啟動之前刪除前面提到的沖突包。此時就可以直接使用Hibernate自帶的Merge或者save或者update進行更新數(shù)據(jù)超過4000的信息了。

六、后感

      Hibernate還是需要繼續(xù)努力的!

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java|Java世界_中文論壇|ChinaJavaWorld技術論壇 : 所有的連接方式...
org.hibernate.HibernateException
linux下手動解壓war包
java – Hibernate將對象保存到多個會話
Struts Hibernate模板開發(fā)筆記
下面是在 WebLogic 8.1 上配置 Hibernate 的具體步驟
更多類似文章 >>
生活服務
熱點新聞
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服