6

我们的项目使用 Hibernate 的程序Configuration来设置我们的 SessionFactory 等。我刚刚将我们从 Hibernate 的第 3 版迁移到第 4 版。现在我收到错误“必须声明元素类型“休眠映射”。” 它说是 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">

但这并不能解决错误。到底是怎么回事?在一个单独的项目中,我为 Hibernate 使用 XML 配置文件,我进行了相同的迁移,并且一切顺利。请注意,在我的环境中必须使用类路径,不能从 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)
4

2 回答 2

11

我也刚从 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 行获取用户名密码,这样我就可以在任何服务器上部署产品。所以我只是把那个程序化了。

于 2013-06-18T14:39:58.633 回答
1

我也从 hibernate 3 迁移到 4 ,

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

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

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

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

如果我更改 dtd 它会给出异常,因为休眠 4 使用 xsd 而不是 dtd。 将 dtd 迁移到 xsd 的 Hibrenate Jira

所以你必须使用 xsd 文件而不是 dtd。

休眠 hbm 示例

于 2013-06-19T10:25:44.397 回答