Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 休眠错误,可能与DTD声明有关_Hibernate - Fatal编程技术网

Hibernate 休眠错误,可能与DTD声明有关

Hibernate 休眠错误,可能与DTD声明有关,hibernate,Hibernate,我们的项目使用Hibernate的编程配置来设置SessionFactory等等。我刚刚将我们从Hibernate的第3版迁移到第4版。现在我得到一个错误“必须声明元素类型”hibernate mapping“,它说这是一个SaxParseException。这很好,但是我检查了我的WEB-INF/lib目录,Hibernate的版本4 core.jar文件在那里,所以它在类路径上 起初我认为这是因为Hibernate团队从 <!DOCTYPE hibernate-mapping PUBL

我们的项目使用Hibernate的编程配置来设置SessionFactory等等。我刚刚将我们从Hibernate的第3版迁移到第4版。现在我得到一个错误“必须声明元素类型”hibernate mapping“,它说这是一个SaxParseException。这很好,但是我检查了我的WEB-INF/lib目录,Hibernate的版本4 core.jar文件在那里,所以它在类路径上

起初我认为这是因为Hibernate团队从

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

我也刚刚从3.0迁移到4.0,我假设有3个原因我使用了以下DTD

在这种情况下的实际修复

确保路径中没有任何旧的3.0 jar,否则会看到此异常

可能原因1

对于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">
我的朋友帮我修好了

总体建议


全力以赴是个坏主意。因为有很多编程内容需要添加,从列到变量映射到变量类型。这将是一场调试噩梦。我建议你做一些非程序化的事情,你可以不用程序来做。对我来说,我只需要从cmd行获取用户名密码,这样我就可以在任何服务器上部署该产品。所以我把它编程了。

我也从hibernate 3迁移到了4

对于hibernate.cfg.xml文件,我使用以下DTD

对于映射文件,我使用以下DTD:


如果我更改dtd,它会给出异常,因为Hibernate4使用xsd而不是dtd。

因此,您必须使用xsd文件而不是dtd


请发布异常跟踪,SAXParser异常也会指出出了什么问题。不知道这是否有帮助,但我有下面的映射文件可以很好地工作:
。查看类路径中是否存在xerces的冲突版本。那个DTD声明应该是有效的,所以问题出在其他地方。@KyleM我这么说是因为我有其他的JAR,它们以xerces作为依赖项,结果把所有其他也以xerces作为依赖项的JAR都搞糟了。不管怎样,算了吧。如果我是你,我会采取剥离方法:从类路径中一个接一个地取出罐子,直到它工作或。。。你已经没有罐子了。嗯,我看到这个太晚了。我会建议你用所采取的(有效的)解决方案编辑你的问题,并要求解释为什么
xerces.jar
会把事情搞砸。我不会觉得这份赏金“值得”,因为虽然我的评论有助于解决这个问题,但我们并没有真正发现根本原因。问题中明确指出,我没有使用.cfg.xml,我使用的是编程配置。。。配置中的.dtd版本是否必须与hibernate映射中的.dtd版本匹配?e、 g.它们都必须是v3.0吗?我认为他们不会,所以我不认为这有什么关系。。DTD只是描述XML文件的语法/结构,对吗?顺便说一句,我将研究可能的原因2。谢谢你的帖子。我确实看到了SAXException,请继续保持耐心,有很多事情出了问题,我不记得是什么改变修复了什么异常(坦率地说,我不在乎),我只是想回忆一下我当时为修复我的问题所做的一切。相信我,它是有效的,所以我们会成功的。只需注意解决方案是与jar相关的。我删除了所有与hibernate相关的jar文件,然后重新开始。我还删除了xerces并将我们的xerces版本更新为最新版本。但是,您的编辑(与编程配置相关的所有内容)与问题无关。我为看到这个解决方案的其他人做了这个记录。不,你没有。这些信息直接与Hibernate文档相矛盾,后者说您仍然可以使用3.0 DTD。此外,我昨天修复了我帖子评论中提到的一切。。。因此,现在一切都在使用3.0 DTD工作。
Caused by: org.xml.sax.SAXParseException; systemId: ; lineNumber: 6; columnNumber: 20; Element type "hibernate-mapping" must be declared.
        at org.apache.xerces.framework.XMLParser.reportError(XMLParser.java:1213)
        at org.apache.xerces.validators.common.XMLValidator.reportRecoverableXMLError(XMLValidator.java:1807)
        at org.apache.xerces.validators.common.XMLValidator.validateElementAndAttributes(XMLValidator.java:3633)
        at org.apache.xerces.validators.common.XMLValidator.callStartElement(XMLValidator.java:1229)
        at org.apache.xerces.framework.XMLDocumentScanner$ContentDispatcher.dispatch(XMLDocumentScanner.java:938)
        at org.apache.xerces.framework.XMLDocumentScanner.parseSome(XMLDocumentScanner.java:381)
        at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:1098)
<?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">
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
try {
    String connection = "jdbc:mysql://"
            + Globals.DBSERVER.trim()
            + "/myDB?autoReconnect=true&failOverReadOnly=false&maxReconnects=10";
    log.debug("Connection URL "+connection) ;
    Configuration configuration = new Configuration();
    configuration
            .setProperty("hibernate.connection.url", connection)
            .setProperty("hibernate.connection.username", Globals.DB_USER_NAME.trim())
            .setProperty("hibernate.connection.password", Globals.DB_PASSWORD.trim())
        ;
    configuration.configure();
        sessionFactory = configuration
            .buildSessionFactory(new ServiceRegistryBuilder()
            .applySettings(configuration.getProperties()).buildServiceRegistry());

                } catch (Exception e) {
                    log.fatal("Unable to create SessionFactory for Hibernate");
                    log.fatal(e.getMessage());
                    log.fatal(e);
                    e.printStackTrace();
                }