每当我与互联网断开连接时,我都会遇到以下异常:
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>
答案 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">
答案 2 :(得分:5)
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)
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!
问候。