Невозможно разобрать hibernate.cfg.xml в автономном режиме
Всякий раз, когда я отключен от Интернета, я получаю следующее исключение:
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
Этот только происходит, когда я в сети. Спящий режим пытается прочитать 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>
Ответы
Ответ 1
Hibernate может разрешать DTD локально (без сетевого подключения).
Ваш DOCTYPE использует новое пространство имен (http://www.hibernate.org/dtd/) для Hibernate 3.6, поэтому у вас может быть более старая версия библиотек Hibernate в ваш путь к классу.
У меня возникла такая же проблема после перехода на Hibernate 3.6.8.Final. У меня было несколько версий hibernate3.jar на пути к классам, из-за чего загружалась старая несовместимая версия 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>
Ответ 2
Это невозможно, потому что файлы hibernate jar также загружают некоторый контент dtd, но медленное подключение к Интернету, с которым он работал.
(1) Расположение файла конфигурации гибернации
Первым решением было предоставить расположение файла DTD в системе с помощью classpath. Таким образом, DocType, работающий в автономном режиме, будет:
<!DOCTYPE hibernate-configuration SYSTEM
"classpath://org/hibernate/hibernate-configuration-3.0.dtd">
(2) Использовать URL-адрес SourceForge DTD с помощью SYSTEM
Другое решение, которое я нашел, - это когда я изменяю URL-адрес DTD на SourceForge и меняю объявление с PUBLIC на SYSTEM.
Итак, ниже также будет работать, если ваша система отключена.
<!DOCTYPE hibernate-configuration SYSTEM
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
Hibernate Work Offline
Ответ 3
- Другой способ - загрузить файл DTD и задать путь к файлу.
а также установить расположение файла dtd в пути сборки Java (eclipse).
Hibernate-конфигурации
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">
Hibernate-отображение
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">
Ответ 4
в моей ситуации:
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>
Ответ 5
Если это помогает кому-то еще... моя проблема заключалась в том, что я включал неправильный артефакт 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>
Ответ 6
Просто проверьте этот сайт https://forum.hibernate.org/viewtopic.php?f=1&t=943281&start=0
Надеюсь, что он решит вашу проблему.
Ответ 7
Я думаю, что вы используете файл hibernate3 jar, но файл DTD Hibernate4.
поэтому решение выбирает один из них: 3 или 4.
Кстати, я настоятельно рекомендую вам использовать Maven для управления зависимостью jar.
Ответ 8
Вы можете использовать внутренний DTD (не очень IMO) или загрузить DTD файл в свою файловую систему.
Проверьте W3Schools 'для получения дополнительной информации: http://www.w3schools.com/dtd/dtd_intro.asp
Ответ 9
В ваших файлах сопоставления вы должны иметь точно такой же тип doctype, как и в DTD отображения.
Тогда и только тогда вы увидите, что dtd, найденный в hibernate3.jar, может быть найден через путь к классам, а работающий за брандмауэром, автономный и т.д. не будет проблемой вообще.
В ваших проектах нет локального dtd для решения этой проблемы, нет кода для перехвата.: -)
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
То же самое, конечно, применимо для файла конфигурации.
Ответ 10
Я использовал следующий метод, чтобы пропустить проверку 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 */
Ответ 11
вместо
<!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">
он отлично работал у меня
Ответ 12
У меня тоже была эта проблема.
Мой 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 имеет NOT www
, а второй URI имеет www
Итак, www
в URI должен быть объявлен в файле конфигурации и во всех файлах сопоставления.
Это не ваш случай (потому что я вижу, что у вас есть URI http://www...
), но он может помочь кому-то.
С уважением.
Ответ 13
Альберто Даниэль действительно прав, действительно добавляя "www". исправлено для меня проблема.
Я думаю, так как файл hibernate-core.jar содержит файлы dtd, именно расположение http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd обрабатывается как-то специально XML-парсер, так что используется dtd из файла jar. Я не проверял это, но это может быть объяснение. Однако: Спасибо Альберто!
С уважением.