Hibernate错误,可能带有DTD声明

Kyl*_*leM 6 hibernate

我们的项目使用Hibernate的程序Configuration设置来设置SessionFactory等.我只是将我们从版本3迁移到了Hibernate的第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">
Run Code Online (Sandbox Code Playgroud)

<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
Run Code Online (Sandbox Code Playgroud)

但这并不能解决错误.到底是怎么回事?在我使用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)
Run Code Online (Sandbox Code Playgroud)

Sid*_*rth 10

我也刚刚从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">
Run Code Online (Sandbox Code Playgroud)

而对于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">
Run Code Online (Sandbox Code Playgroud)

对我来说效果很好.

可能的原因2

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

编辑:

我使用混合配置programmatic和cfg文件.当我尝试使用所有程序时,它对我不起作用.我也没有得到太多的帮助.但下面对我有用.

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();
                }
Run Code Online (Sandbox Code Playgroud)

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

总体建议

所有程序化都是一个坏主意.由于存在大量编程内容,因此需要从列添加到变量映射到变量类型.这将是一场调试噩梦.我建议你做一些程序化的东西,你可以在没有程序化的情况下做.对我来说,我只需要从cmd行获取用户名密码,这样我就可以在任何服务器上部署产品.所以我只是做了那个程序化的.