标签:
离线使用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
解决离线Could not parse configuration:hibernate.cfg.xml错误
标签:
原文地址:http://www.cnblogs.com/whytohow/p/5125694.html