当前位置: 首页 > 面试题库 >

Hibernate错误,可能带有DTD声明

单于淇
2023-03-14
问题内容

我们的项目使用Hibernate的程序Configuration来设置我们的SessionFactory等。我只是将我们从Hibernate的版本3迁移到了版本4。现在,我收到错误消息“必须声明元素类型“
hibernate-mapping”。它说是SaxParseException。很好,一切都很好,但是我检查了WEB-INF /
lib目录,并找到了Hibernate的版本4核心.jar文件,因此它位于类路径中。

起初我以为是因为Hibernate团队从

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

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

但这并不能解决错误。到底是怎么回事?在一个单独的项目中,我将XML配置文件用于Hibernate,我进行了相同的迁移,并且运行良好。请注意,在我的环境中必须使用classpath,不能从Internet或类似的东西下载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)

问题答案:

我也只是从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">

对于hbm文件

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

对我来说效果很好。

可能的原因2

<hibernate-mapping>的hbm文件中有拼写错误。

编辑:

我正在使用编程和cfg文件的混合配置。当我尝试使用所有程序化程序时,它对我不起作用。我也没有从SO获得太多帮助。但是下面对我有用。

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();
                }

我的问题帮助我解决了这个问题。

总体建议

全部采用编程方式是一个坏主意。由于有很多程序化的东西,您需要从列到变量的映射到变量类型的添加。这将是调试的噩梦。我建议您做一些
程序化的工作,而无需编程就可以做到。对我来说,我只需要从cmd行获取用户名密码,以便可以将产品部署在任何服务器上。因此,我只是将该程序化了。



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

  • 今天我想从SQLCe转到MongoDB。我下载了驱动程序,并在我的电脑上运行本地服务器。 以下是我的实际代码(顺便说一句,我甚至不知道将IMongoCollection转换为MongoCollection是否安全): 但是,每当我试图运行该程序时,就会出现以下错误:“System”类型的未处理异常。木卫一。mscorlib中发生FileNotFoundException。动态链接库 其他信息:无法

  • 问题内容: hibernatejar中的DTD是了解可以包含哪些属性以及该标记的预期名称的好方法。 打开DTD文件是获得所有元素和属性的概述,查看默认值以及一些注释的最简单方法。 这将帮助程序员从scracth编写hibernate.cfg.xml文件(疯狂,但有些人确实要求在不使用internet的情况下实现:O) 当我们有一个hibernatejar时,请告诉DDT的位置。 这不是编程问题,但

  • 问题内容: 当我尝试编译时: 我得到这些错误: 在我看来,我在方法的顶部初始化了它们。怎么了 问题答案: 你声明了它们,但没有初始化它们。初始化它们是将它们设置为等于一个值: 因为未初始化变量,但在循环中增加了变量(例如),所以会收到错误消息。 Java原语具有默认值,但如下一位用户所述 当声明为类成员时,它们的默认值为零。局部变量没有默认值

  • 我的编译器不会有它(现在怎么办?我必须完全重写整个应用程序吗? 要查看编译器拒绝的行,请执行系统搜索。出来println(celsius输出“C”); 当试图编译时,编译器告诉我,“变量celsiusOutput可能尚未初始化。”编译器对另外两个输出项中的任何一个都不说同样的话:华氏输出和开尔文输出。