java - Hibernate 映射在离线模式下不工作

标签 java spring hibernate

我们正在进行灾难恢复练习,一些 Hibernate+Spring 应用程序没有启动并出现以下错误

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.InvalidMappingException: Could not parse mapping document from input stream
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1337)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
                at java.security.AccessController.doPrivileged(AccessController.java:214)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
                at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
                at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221)
                at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
                at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
                at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByName(AbstractAutowireCapableBeanFactory.java:1029)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:977)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
                ... 55 more
Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from input stream
                at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:541)
                at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:638)
                at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334)
                ... 67 more
**Caused by: org.dom4j.DocumentException: Server returned HTTP response code: 504 for URL: http://www.jboss.org/dtd/hibernate/hibernate-mapping-3.0.dtd Nested exception: Server returned HTTP response code: 504 for URL: http://www.jboss.org/dtd/hibernate/hibernate-mapping-3.0.dtd**
                at org.dom4j.io.SAXReader.read(SAXReader.java:484)
                at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:532)
                ... 71 more

hbm 映射 XML 文件有

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

在 SO 和 Hibernate 论坛上搜索修复看起来我们需要将文档类型中的 DTD 设置为 SYSTEM 以便它从本地系统读取而不是在 sourceforge.net 上托管的公共(public) dtd

<!DOCTYPE hibernate-mapping SYSTEM "hibernate-mapping-3.0.dtd">

但是有了这个 Hibernate 正在寻找应用服务器根文件夹中的文件

Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from input stream
                at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:541)
                at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:638)
                at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334)
                ... 72 more
Caused by: org.dom4j.DocumentException: C:\IBMSOA\SDP70\runtimes\base_v61\profiles\AppSrvWSFP01\hibernate-mapping-3.0.dtd (The system cannot find the file specified.) Nested exception: C:\IBMSOA\SDP70\runtimes\base_v61\profiles\AppSrvWSFP01\hibernate-mapping-3.0.dtd (The system cannot find the file specified.)
                at org.dom4j.io.SAXReader.read(SAXReader.java:484)
                at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:532)
                ... 76 more

应该如何指定 SYSTEM DTD 引用,以便 Hibernate 从 hibernate.jar 中读取 DTD 而不是在文件系统中查找它?

最佳答案

查看 DTDEntityResolver 的 hibernate 源 http://grepcode.com/file/repo1.maven.org/maven2/org.hibernate/hibernate-core/3.3.1.GA/org/hibernate/util/DTDEntityResolver.java#DTDEntityResolver以下对我们有用

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

为开源而欢呼!

关于java - Hibernate 映射在离线模式下不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10334610/

相关文章:

java - Spring JMX - 将条目映射到属性名称和值

spring - 注销后删除access_token

Java Spring 与 thymeleaf 复选框未选中时为空而不是 false

performance - 具有空值的 JPA/Hibernate 查询优化

java - 获取未在 Hibernate 中映射的 bean 类型列表

java - Autowiring HibernateInterceptor 作为通知

java - 如何使 Tomcat 7 应用程序向后兼容?

java - 如何让 thread.sleep 工作

java - 如何一键对齐两个文本

java - Spring @Autowired 令人困惑