一尘不染

Hibernate错误,可能带有DTD声明

hibernate

我们的项目使用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)

阅读 306

收藏
2020-06-20

共1个答案

一尘不染

我也只是从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行获取用户名密码,以便可以将产品部署在任何服务器上。因此,我只是将该程序化了。

2020-06-20