Не могу разобрать hibernate.cfg.xml в автономном режиме - PullRequest
17 голосов
/ 29 ноября 2010

Каждый раз, когда я отключаюсь от Интернета, я получаю следующее исключение:

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 ]

19 голосов
/ 04 января 2012

Hibernate может разрешать DTD локально (без подключения к сети).

Ваш DOCTYPE использует новое пространство имен (http://www.hibernate.org/dtd/) для Hibernate 3.6, поэтому в вашем пути к классам может быть более старая версия библиотек 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>
6 голосов
/ 26 февраля 2015

Это невозможно, потому что hibernate jar-файлы также загружают некоторый контент dtd, но при медленном интернет-соединении это работает.

(1) Расположение файла конфигурации Hibernate

Первым решением было предоставить местоположение файла DTD в системе, используя classpath.Таким образом, DocType, который работал бы в автономном режиме, был бы:

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

(2) Использовать URL-адрес DTD SourceForge с SYSTEM

Другое решение, которое я нашел работающим, - это когда я меняю DTDURL-адрес SourceForge и изменение объявления с PUBLIC на SYSTEM.

Поэтому ниже также будет работать, если ваша система находится в автономном режиме.

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

Hibernate Work Offline

5 голосов
/ 26 февраля 2015
  • Другой способ - скачать файл DTD и указать путь к файлу. а также установить местоположение файла dtd в пути сборки Java (eclipse).

Hibernate-конфигурации

Оригинальный 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">

Hibernate-отображение

Оригинальный 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">
2 голосов
/ 01 августа 2013

В случае, если это поможет кому-то еще ... моя проблема заключалась в том, что я включил неправильный артефакт 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>
2 голосов
/ 24 февраля 2013

в моей ситуации: 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>

и исключаю dom4j в pom.xml

    <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>
1 голос
/ 07 сентября 2012

Я думаю, вы используете JAR-файл Hibernate3, но файл DTD Hibernate4.поэтому решение состоит в том, чтобы выбрать один из них: 3 или 4.

Кстати, я настоятельно рекомендую вам использовать Maven для управления зависимостями jar.

1 голос
/ 29 ноября 2010

Просто зайдите на этот сайт https://forum.hibernate.org/viewtopic.php?f=1&t=943281&start=0

Надеюсь, что это решит вашу проблему.

0 голосов
/ 19 марта 2016

вместо

<!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"> 

у меня все работало нормально

0 голосов
/ 04 декабря 2014

Я использовал следующий метод, чтобы пропустить проверку 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 */
0 голосов
/ 12 ноября 2014

Альберто Даниэль на самом деле прав, добавив «www». исправил для меня проблему.

Полагаю, поскольку файл hibernate-core.jar содержит файлы dtd, именно местоположение http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd обрабатывается каким-то образом специально синтаксическим анализатором XML, так что используется dtd из файла jar. Я не проверял это, но это может быть объяснением. Однако: спасибо, Альберто!

Привет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...