解决离线Could not parse configuration:hibernate.cfg.xml错误

 

离线使用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

posted @ 2016-01-12 21:36  WhyToHow  阅读(3001)  评论(0编辑  收藏  举报