离线时无法解析hibernate.cfg.xml

时间:2010-11-29 06:17:42

标签: java hibernate

每当我与互联网断开连接时,我都会遇到以下异常:

org.hibernate.HibernateException: Could not parse configuration: com/mashlife/resources/hibernate.cfg.xml
    at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1542)
    at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:1035)
    at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:64)
    at org.hibernate.cfg.Configuration.configure(Configuration.java:1476)
    at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:1017)

Caused by: org.dom4j.DocumentException: www.hibernate.org Nested exception: www.hibernate.org
    at org.dom4j.io.SAXReader.read(SAXReader.java:484)
    at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1532)
    ... 45 more

当我离线时,会发生。在解析配置时,hibernate是否尝试读取DTD?这里的根本原因是什么?

这是我的hibernate.cfg.xml:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/foo</property>
        <property name="connection.username">user</property>
        <property name="connection.password">pass</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- DO NOT Echo all executed SQL to stdout -->
        <property name="show_sql">false</property>

        <!-- Names the annotated entity class -->
        <!--<mapping class="org.hibernate.tutorial.annotations.Event"/>-->

    </session-factory>

</hibernate-configuration>

13 个答案:

答案 0 :(得分:18)

Hibernate可以在本地解析DTD(没有网络连接)。

您的DOCTYPE正在使用Hibernate 3.6的新命名空间(http://www.hibernate.org/dtd/),因此您的类路径中可能有旧版本的Hibernate库。

升级到Hibernate 3.6.8.Final之后我遇到了同样的问题。我在类路径上有多个版本的hibernate3.jar,导致加载DTD Entity Resolver旧的不兼容版本,只能使用旧的命名空间(http://hibernate.sourceforge.net/)。作为参考,这里是指向较新DTD Entity Resolver的链接。

我正在使用hibernate3-maven-plugin,它对旧版本的Hibernate具有传递依赖性,所以我只需要在Hibernate 3.6.8.Final上指定一个插件依赖。

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>hibernate3-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
    ...
</configuration>
<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.6.8.Final</version>
    </dependency>
</dependencies>
</plugin>

答案 1 :(得分:6)

这是不可能的,因为,hibernate jar文件也加载了一些dtd内容,但它的工作速度很慢。

(1)休眠配置文件位置

第一个解决方案是使用classpath在系统中提供DTD文件位置。因此离线工作的DocType将是;

<!DOCTYPE hibernate-configuration SYSTEM 
    "classpath://org/hibernate/hibernate-configuration-3.0.dtd">

(2)将SourceForge DTD URL与SYSTEM

一起使用

我发现的另一个解决方案是将DTD URL更改为SourceForge并将声明从PUBLIC更改为SYSTEM。

如果您的系统处于离线状态,那么下面也会有效。

<!DOCTYPE hibernate-configuration SYSTEM 
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

Hibernate Work Offline

答案 2 :(得分:5)

  • 另一种方法是你应该下载DTD文件并设置文件路径。 并在java Build path(eclipse)中设置dtd文件位置。

休眠构

Orignal DTD

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

更正了DTD

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://localhost:8080/YourProject/DTDLocation/hibernate-configuration-3.0.dtd">

休眠映射

Orignal DTD

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

更正了DTD

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://localhost:8080/YourProject/DTDLocation/hibernate-mapping-3.0.dtd">

答案 3 :(得分:2)

在我的情况下: JBoss AS 7

我检查:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

并在pom.xml中排除dom4j

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.1.9-SNAPSHOT</version>
        <exclusions>
            ...........
            <exclusion>
                <artifactId>dom4j</artifactId>
                <groupId>dom4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>

答案 4 :(得分:2)

如果这有助于其他人......我的问题是我包含了错误的Maven工件。我加入了spring-hibernate3

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-hibernate3</artifactId>
        <version>2.0.8</version>
    </dependency>

spring-orm替换它解决了这个问题:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>2.5.6.SEC03</version>
    </dependency>

答案 5 :(得分:1)

只需查看此网站https://forum.hibernate.org/viewtopic.php?f=1&t=943281&start=0

即可

希望它能解决你的问题。

答案 6 :(得分:1)

我认为你使用的是Hibernate3 jar文件,但是Hibernate4是DTD文件。 所以解决方案是选择其中之一:3或4.

BTW,我强烈建议您使用Maven进行jar依赖关系管理。

答案 7 :(得分:0)

您可以使用内部DTD(不是漂亮的IMO)或将DTD文件下载到您的文件系统。

查看W3Schools'以获取更多信息:http://www.w3schools.com/dtd/dtd_intro.asp

答案 8 :(得分:0)

在地图文件中,您必须具有与映射DTD中找到的完全相同的文档类型。

然后,只有这样你才能看到在hibernate3.jar中找到的dtd可以通过类路径找到,并且在防火墙后面运行,独立等等都不会有任何问题。 您的项目中没有本地dtd来解决此问题,没有代码可以拦截。 : - )

<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

同样适用于配置文件。

答案 9 :(得分:0)

我使用以下方法跳过配置文件

中Doctype的验证

代码: -

public static Document parseConfiguration(String resourcePath) throws Exception {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();



        factory.setValidating(false); 

        DocumentBuilder builder = factory.newDocumentBuilder();

         File f=new File(resourcePath);


        FileInputStream fs=new FileInputStream(f);

        Document dtd = builder.parse(fs);

        return dtd;

        } 



public static void main(String[] args)
 { 

   Document dtd=null;

        try {
            dtd = parseConfiguration("src/hibernate.cfg.xml");

        } catch (Exception e) {

            e.printStackTrace();
        }

        SessionFactory  factory=new AnnotationConfiguration()  
         .configure(dtd).buildSessionFactory(); 
/*
Now this code worked for me 
You just have to use annotation instead of hbm.xml file because I was not able to skip the validation of mapping file as it is written inside the cfg.xml file
Reply if you got some other answer to run hibernate application in offline */

答案 10 :(得分:0)

而不是

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

使用

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
      "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

它对我来说很好

答案 11 :(得分:-1)

我也有这个问题。 我的DOCTYPE是:

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">

应该是:

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

你能看出区别吗? 第一个URI没有www,第二个URI有www

因此,必须在配置文件和所有映射文件中声明URI中的www

这不是你的情况(因为我可以看到你有http://www... URI),但它可能对某人有帮助。

问候。

答案 12 :(得分:-1)

Alberto Daniel实际上是对的,确实添加了&#34; www。&#34;为我解决问题。

我想,由于hibernate-core.jar文件包含dtd文件,因此XML解析器特别以某种方式处理位置http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd,以便使用jar文件中的dtd。我没有证实这一点,但这可能是一个解释。但是:谢谢Alberto!

问候。