我正在尝试制作一个第三方的简单的独立/摇摆应用程序,该应用程序使用hibernate模式在另一个应用程序的数据库上进行连接,所以这是我所做的:
1-使用的jar:
hibernate-core-3.5.1-Final hibernate-entitymanager-3.5.1-Final hibernate-jpa-2.0-api-1.0.0.Final hibernate-annotations-3.5.1-Final hibernate-commons-annotations-3.2.0.Final dom4j-1.6.1 slf4j-api-1.6.4 slf4j-log4j12-1.6.4 log4j-1.2.16.jar commons-collections-3.2 jta-1.1 mysql-connector-java-5.1.14 (or compatible connector with your DB) commons-logging-1.1.1 commons-collections-3.2
2- hibernate.cfg.xml(位于src文件夹中):
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://127.0.0.1:3306/myapp</property> <property name="connection.username">myuser</property> <property name="connection.password">mypass</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="current_session_context_class">thread</property> </session-factory> </hibernate-configuration>
3- SessionFactoryHelper:
public class SessionFactoryHelper { private static final SessionFactory sessionFactory; static { try { /* * Build a SessionFactory object from session-factory configuration * defined in the hibernate.cfg.xml file. In this file we register * the JDBC connection information, connection pool, the hibernate * dialect that we used and the mapping to our hbm.xml file for each * POJO (Plain Old Java Object). */ sessionFactory = new Configuration().configure() .buildSessionFactory(); } catch (Throwable e) { System.err.println("Error in creating SessionFactory object." + e.getMessage()); throw new ExceptionInInitializerError(e); } } /* * A static method for other application to get SessionFactory object * initialized in this helper class. */ public static SessionFactory getSessionFactory() { return sessionFactory; } }
4-样本查询:
Session session = SessionFactoryHelper.getSessionFactory() .getCurrentSession(); session.beginTransaction(); int count = (Integer) session.createSQLQuery( "select count(*) from users").uniqueResult(); session.getTransaction().commit(); System.out.println("Users Count: " + count);
运行该应用程序时,出现以下异常:
Error in creating SessionFactory object.invalid configuration Exception in thread "main" java.lang.ExceptionInInitializerError at com.xeno.xecamp.desktopManagement.SessionFactoryHelper.<clinit>(SessionFactoryHelper.java:24) at com.myapp.Main.main(Main.java:9) Caused by: org.hibernate.MappingException: invalid configuration at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1579) at org.hibernate.cfg.Configuration.configure(Configuration.java:1520) at org.hibernate.cfg.Configuration.configure(Configuration.java:1506) at com.xeno.xecamp.desktopManagement.SessionFactoryHelper.<clinit>(SessionFactoryHelper.java:19) ... 1 more Caused by: org.xml.sax.SAXParseException: Document is invalid: no grammar found. at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:250) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3103) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:922) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) at org.dom4j.io.SAXReader.read(SAXReader.java:465) at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1576) ... 4 more
谁能告诉我我的配置出了什么问题?
这个问题与Hibernate根本无关,而与XML结构有关。
Hibernate将SAX Reader设置为使用验证(org.hibernate.util.XMLHelper#createSAXReader(String,List,EntityResolver)
它变得更像这样:
SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(true); factory.setNamespaceAware(true);
Java Dosc说
方法setValidating(boolean)-进行DTD验证,如果不存在DTD,则导致失败。如果只希望模式验证而不是DTD验证,请使用setValidating(false)。
您的错误说清楚了:
Caused by: org.xml.sax.SAXParseException: Document is invalid: no grammar found.
在本教程中,您将找到有关hibernateconf文件的所有必需信息。
要修复它,您将需要添加:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">