java 在独立应用程序的休眠中配置 sessionFactory
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10586512/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Configure sessionFactory in hibernate in standalone application
提问by Mahmoud Saleh
i am trying to make a 3rd party simple standalone/swing application that uses hibernate to connect on database for another application, so here's what i did:
我正在尝试制作一个 3rd 方简单的独立/swing 应用程序,它使用 hibernate 连接另一个应用程序的数据库,所以这就是我所做的:
1- Jars used:
1- 使用的罐子:
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 (it's inside the src folder):
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:
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- Sample Query:
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);
when running the application, i gets the following exception:
运行应用程序时,我收到以下异常:
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
can anyone please tell me what's wrong with my configuration ?
谁能告诉我我的配置有什么问题?
回答by Damian Leszczyński - Vash
The problem is not related to Hibernate at all but to the XML structure.
问题根本与 Hibernate 无关,而与 XML 结构有关。
The SAX Reader is set by Hibernate to use validation (org.hibernate.util.XMLHelper#createSAXReader(String,List,EntityResolver)
SAX Reader 由 Hibernate 设置为使用验证(org.hibernate.util.XMLHelper#createSAXReader(String,List,EntityResolver)
It goes more less like this:
它更像这样:
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
factory.setNamespaceAware(true);
Java dosc says
Java 文档 说
Method setValidating(boolean) - equests DTD validation and causes a failure if no DTD exists. If you only want schema validation and not DTD validation then use setValidating(false).
方法 setValidating(boolean) - 请求 DTD 验证并在不存在 DTD 时导致失败。如果您只需要模式验证而不是 DTD 验证,则使用 setValidating(false)。
Your error says clear:
你的错误说清楚:
Caused by: org.xml.sax.SAXParseException: Document is invalid: no grammar found.
Caused by: org.xml.sax.SAXParseException: Document is invalid: no grammar found.
In this tutorial you will find all required information about hibernate conf file.
在本教程中,您将找到有关 hibernate conf 文件的所有必需信息。
to fix it you will need to add:
要修复它,您需要添加:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
回答by kosa
You didn't declare any DTD in hibernate.cfg.xml
您没有在 hibernate.cfg.xml 中声明任何 DTD
The message is saying that you are trying to validate the document, but no DTD has been declared, because no DOCTYPE declaration is present.
The message is saying that you are trying to validate the document, but no DTD has been declared, because no DOCTYPE declaration is present.