环境: eclipse 3.1.1 + Hibernate 3.1 +Hibernate Synchronizer-3.1.5
log4j:WARN No appenders could be found for logger (org .hibernate .cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
org .hibernate .MappingException: invalid configuration
at org .hibernate .cfg.Configuration .doConfigure(Configuration .java:1369)
at org .hibernate .cfg.Configuration .configure(Configuration .java:1310)
at org .hibernate .cfg.Configuration .configure(Configuration .java:1296)
at net.sc.hibernate .base._BaseRootDAO.initialize(_BaseRootDAO.java:52)
at net.sc.hibernate .base._BaseRootDAO.initialize(_BaseRootDAO.java:41)
at net.sc.hibernate .base._BaseRootDAO.initialize(_BaseRootDAO.java:32)
at HibernateTest.main(HibernateTest.java:10)
Caused by: org .xml.sax.SAXParseException: Document is invalid : no grammar found.
at org .apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org .apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org .apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org .apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org .apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org .apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
at org .apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org .apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org .apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org .apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org .apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org .apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org .dom4j.io.SAXReader.read(SAXReader.java:465)
at org .hibernate .cfg.Configuration .doConfigure(Configuration .java:1366)
... 6 more
1、首先没有配置日志:
1)把log4j的jar加进构建路径
2)Hibernate 解压后etc目录下面的log4j.properties拷到src(就是放源代码的目录)下即可
2、在配置文件hibernate .cfg.xml前面加上上面这段声明
<!DOCTYPE hibernate -configuration PUBLIC
"-//Hibernate /Hibernate Configuration DTD 3.0//EN"
"http://hibernate .sourceforge.net/hibernate -configuration -3.0.dtd ">
3、把映射文件userinfo.hbm.xml中的generator生成方式改为native
<generator class="java.security.Identity"/>
改为:<generator class="native"/>
4、新的错误:
org .hibernate .HibernateException: No CurrentSessionContext configured!
at org .hibernate .impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:504)
at com.kissbi.hibernate .base._BaseRootDAO.getSession(_BaseRootDAO.java:56)
at com.kissbi.hibernate .base._BaseRootDAO.getSession(_BaseRootDAO.java:42)
at com.kissbi.hibernate .base._BaseRootDAO.run(_BaseRootDAO.java:761)
at com.kissbi.hibernate .base._BaseRootDAO.save(_BaseRootDAO.java:623)
at com.kissbi.hibernate .base.BaseUserInfoDAO.save(BaseUserInfoDAO.java:110)
at com.kissbi.hibernate .dao.UserInfoDAO.main(UserInfoDAO.java:27)
这个错误太隐蔽了:
如果是用hibernate .cfg.xml的话,生成session的方法应该是用以下这种文件
public static SessionFactory sessionFactory;
private static Configuration configuration ;
static {
try {
configuration = new Configuration ();
sessionFactory = configuration .configure().buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
我们使用如下代码获取Session:
sessionFactory = new Configuration ().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
使用getCurrentSession 不对;应该使用openSession
参考hibernate api doc 对 openSession 和 getCurrentSession 的说明