我们的项目使用Hibernate的程序Configuration来设置我们的SessionFactory等。我只是将我们从Hibernate的版本3迁移到了版本4。现在,我收到错误消息“必须声明元素类型“ hibernate-mapping”。它说是SaxParseException。很好,一切都很好,但是我检查了WEB-INF / lib目录,并找到了Hibernate的版本4核心.jar文件,因此它位于类路径中。
Configuration
起初我以为是因为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文件中有拼写错误。
<hibernate-mapping>
编辑:
我正在使用编程和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行获取用户名密码,以便可以将产品部署在任何服务器上。因此,我只是将该程序化了。