離線使用hibernate tool 生成反向工程,在配置 配置文件完,生成配置文件后,會報出org.hibernate.HibernateException: Could not parse configuration:錯誤
原因:就是讀取不到本地dtd約束,然后必須每次聯網加載才行,具體原因不了解,因為網絡這方面的解答都比較模糊,應該是小范圍問題,感覺是jdk與tools要求版本不一致,導致部分插件未正常安裝,解析出現問題
解決方式(同理可解決映射文件出現的解析不成的問題)
: 首先確認cfg.xml文件的格式內容的正確
方式1. 連接網絡!!!!!
(如果網絡不好會出現解析不成功)
方式2. 使用本地的dtd..(hibernate設計是首先讀取本地,但可能是由於插件出現問題,讀取不了本地,直接加載網絡)
(快捷,提高效率)
<!DOCTYPE hibernate-configuration SYSTEM "classpath://org/hibernate/hibernate-configuration-3.0.dtd"> <!—這是最可取的替換方式-->
(使用前,請確認是否將hibernate包導入)
------------------------------------------------------弄點廢話
之前測試時,電腦連着網絡,在修改本地路徑時,只是修改"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"這部分內容,只要聯網其實怎么修改都不影響,因為前邊還有個public id影響,還有不應該使用普通的路徑格式,根據xml格式使用uri格式,因為xml分析器首先會以某種機制查找公共DTD的名稱,查到了,則以此為標准,如果查不到,再到DTD位置上去找,所以還是只需要修改部分內容即可,但是需要路徑寫對,尋找本地的xml約束有多種方式。
第一種在eclipse設置中,window/preferences/xml/xml catalog/ 設置下 找到-//Hibernate/Hibernate Configuration DTD 3.0//EN 點擊,下方詳情會出現其uri。。復制並替換xml的dtd即可
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "file:/C:/Program Files/eclipse/../../xx/.eclipse/org.eclipse.platform_4.5.1_1709980481_win32_win32_x86_64/plugins/org.hibernate.eclipse.mapper_4.0.1.Final-v20150324-2307-B95/dtd/hibernate-configuration-3.0.dtd"> <!--這是通過xml設置中找到的,各個電腦的路徑不同,要復制自己的路徑,路徑太長,不建議使用-->
第二種,其實在hibernate-core-xx核心jar包里已經內置dtd文件了(配置文件和映射文件都有),在org/hibernate/包下,由於已經導包,所以也可以使用classpath路徑
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "classpath://org/hibernate/hibernate-configuration-3.0.dtd"> <!--這是使用classpath路徑配置,適應各個機器,建議使用,但使用以下方式,解析會快捷一些-->
雖然以上都能解決問題,但是建議使用直接本地約束的方式SYSTEM,不管有網沒網直接讀取本地約束,這樣速度要快的多
<!DOCTYPE hibernate-configuration SYSTEM "file:/C:/Program Files/eclipse/../../xx/.eclipse/org.eclipse.platform_4.5.1_1709980481_win32_win32_x86_64/plugins/org.hibernate.eclipse.mapper_4.0.1.Final-v20150324-2307-B95/dtd/hibernate-configuration-3.0.dtd"> <!--這是通過xml設置中找到的,路徑長不建議使用--> <!DOCTYPE hibernate-configuration SYSTEM "classpath://org/hibernate/hibernate-configuration-3.0.dtd"> <!--classpath配置-,路徑短,適應不同機器,速度快,建議使用此配置->
(同理如果映射文件出現問題也可以采取此方式)
<!DOCTYPE hibernate-mapping SYSTEM "classpath://org/hibernate/hibernate-mapping-3.0.dtd">
有關dtd的知識(主要是兩種引用方式)
定義外部DTD的語法:
<!DOCTYPE 根元素名 SYSTEM "外部DTD文件的URI">(SYSTEM表示DTD文件是私有的。引號不能少)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="simple1.css" type="text/css" ?>
<!-- 外部DTD -->
<!DOCTYPE poem SYSTEM "poem.dtd">
<poem>
<title>靜夜思</title>
<author>李白</author>
<line>床前明月光,</line>
<line>疑事地上霜.</line>
<line>舉頭望明月,</line>
<line>低頭思故鄉.</line>
<commet>李白是中國最偉大的詩人!</commet>
</poem>
-----------------------------相同目錄下的poem.dtd內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT poem (title,author,line+,commet)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT line (#PCDATA)>
<!ELEMENT commet (#PCDATA)>
如果想引用一個公共的DTD文檔,又該如何呢?
<!DOCTYPE 根元素名 PUBLIC "DTD的名稱" "外部DTD文件的URI">(PUBLIC表示DTD文件是公共的,注意在PUBLIC之后,還多了一個DTD的名稱。引號不能少)
下面是taglib的DTD:
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
分析一下這個外部DTD聲明:
1、關鍵字DOCTYPE,PUBLIC。
2、根元素名:taglib。所以每一個標簽庫定義文件都是以taglib為根元素的,否則就不會驗證通過。
3、紫色的字"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN",這是公共DTD的名稱。這個東西命名是有些講究的。首先它是以"-"開頭的,表示這個DTD不是一個標准組織制定的。(如果是ISO標准化組織批准的,以“ISO”開頭,如果不是ISO的標准化組織批准的,以“+”開頭。)。接着就是雙斜杠“//”,跟着的是DTD所有者的名字,很明顯這個DTD是sun公司定的。接着又是雙斜杠“//”,然后跟着的是DTD描述的文檔類型,可以看出這份DTD描述的是jsp 標簽庫1.2版本的格式。再跟着的就是“//”和ISO 639語言標識符。
4、綠色的字"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd",表示這個DTD的位置。
疑問:是不是xml分析器都會到java.sun.com上去找這個dtd呢?答案是否定的,xml分析器首先會以某種機制查找公共DTD的名稱,查到了,則以此為標准,如果查不到,再到DTD位置上去找。
有關uri url方面的知識
URI:Uniform Resource Identifier,統一資源標識符;
URL:Uniform Resource Locator,統一資源定位符;
URN:Uniform Resource Name,統一資源名稱。
其中,URL,URN是URI的子集。
Web上地址的基本形式是URI,它代表統一資源標識符。有兩種形式:
URL:目前URI的最普遍形式就是無處不在的URL或統一資源定位器。
URN:URL的一種更新形式,統一資源名稱(URN, Uniform Resource Name)不依賴於位置,並且有可能減少失效連接的個數。但是其流行還需假以時日,因為它需要更精密軟件的支持。
URI是以某種統一的(標准化的)方式標識資源的簡單字符串。
URI一般由三部分組成:
1. 訪問資源的命名機制。
2. 存放資源的主機名。
3. 資源自身的名稱,由路徑表示。
典型情況下,這種字符串以scheme(命名URI的名字空間的標識符——一組相關的名稱)開頭,語法如下:
[scheme:] scheme-specific-part
URI以scheme和冒號開頭。Scheme用大寫/小寫字母開頭,后面為空或者跟着更多的大寫/小寫字母、數字、加號、減號和點號。冒號把 scheme與scheme-specific-part分開了,並且scheme-specific-part的語法和語義(意思)由URI的名字空間 決定。如下面的例子:
http://www.cnn.com,其中http是scheme,//www.cnn.com是 scheme-specific-part,並且它的scheme與scheme-specific-part被冒號分開了。
URI有絕對和相對之分,絕對的URI指以scheme(后面跟着冒號)開頭的URI。前面提到的http://www.cnn.com就是絕對的URI 的一個例子,其它的例子還有mailto:jeff@javajeff.com、news:comp.lang.java.help和xyz: //whatever。你可以把絕對的URI看作是以某種方式引用某種資源,而這種方式對標識符出現的環境沒有依賴。如果使用文件系統作類比,絕對的 URI類似於從根目錄開始的某個文件的徑。
與絕對的URI不同的,相對的URI不是以scheme(后面跟着冒號)開始的URI。 它的一個例子是articles/articles.html。你可以把相對的URI看作是以某種方式引用某種資源,而這種方式依賴於標識符出現的環境。 如果用文件系統作類比,相對的URI類似於從當前目錄開始的文件路徑。
URL是Uniform Resource Location的縮寫,譯為"統一資源定位符"。通俗地說,URL是Internet上用來描述信息資源的字符串,主要用在各種WWW客戶程序和服務器 程序上,特別是著名的Mosaic。采用URL可以用一種統一的格式來描述各種信息資源,包括文件、服務器的地址和目錄等。
URL的格式由下列三部分組成:
第一部分是協議(或稱為服務方式);
第二部分是存有該資源的主機IP地址(有時也包括端口號);
第三部分是主機資源的具體地址。,如目錄和文件名等。
第一部分和第二部分之間用"://"符號隔開,第二部分和第三部分用"/"符號隔開。第一部分和第二部分是不可缺少的,第三部分有時可以省略。
目前最大的缺點是當信息資源的存放地點發生變化時,必須對URL作相應的改變。因此人們正在研究新的信息資源表示方法,例如:URI(Universal Resource Identifier)即"通用資源標識"(參見RFC 1630)、URN(Uniform Resource Name)即"統一資源名"和URC(Uniform Resource Citation)即"統一資源引用符"等。
URI目前還處在進一步的研究當中。研究的方向就是彌補URL目前存在的缺點。
參考資料
http://www.blogjava.net/flysky19/articles/93379.html
http://my.oschina.net/aiguozhe/blog/40592
http://stackoverflow.com/questions/4301294/cant-parse-hibernate-cfg-xml-while-offline