Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1469386
  • 博文数量: 309
  • 博客积分: 1966
  • 博客等级: 上尉
  • 技术积分: 2665
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-08 16:19
个人简介

Follow excellent,And success will chase you.

分类: Java

2013-07-28 22:46:11

这段时间刚开始学习Hibernate,到官网下文件包,发现刚出来的hibernate-release-4.0.0.CR6,于是下了下来,对着书上的例子一敲,问题来了...见下图

没办法,又重新进官网下了个hibernate-distribution-3.6.8.Final,发现没有问题。

于是乎......在官网和4.0源文件中穿插研究了几个小时,终于搞明白怎么回事了。


Hibernate4.0新增了一个ServiceRegistry接口,应用于Hibernate的配置或者服务等将统一向这个ServiceRegistry注册后才能生效。所以需要构建一个ServiceRegistry对象,将配置信息向它注册,然后Configuration对象根据从这个ServiceRegistry对象中获取配置信息生成SessionFactory。

那么这个ServiceRegistry怎么来呢?看看源代码结构就能发现它的来源地了——org.hibernate.service.ServiceRegistryBuilder。

分析一下这个ServiceRegistryBuilder的源文件,得出以下新的构建SessionFactory的方式:


Java代码 复制代码 收藏代码
  1. Configuration config = new Configuration();
  2. SessionFactory sf = config.buildSessionFactory(
  3. new ServiceRegistryBuilder()
  4. .configure()
  5. .buildServiceRegistry());


却发现仍然有问题,居然是读取hibernate.cfg.xml文件出错,异常如下:

[org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'hibernate-configuration'.]

该文件经hibernate3测试通过,不可能出错,难道是要用hibernate-configuration-4.0.dtd?打开浏览器输入地址,发现没有这个文件,无奈,不用xml文件配置,使用hibernate.properties进行配置,修改代码如下:



Java代码 复制代码 收藏代码
  1. Configuration config = new Configuration();
  2. SessionFactory sf = config.buildSessionFactory(
  3. new ServiceRegistryBuilder()
  4. .buildServiceRegistry());

运行测试通过!

不过,这只是很肤浅的用法,更深入的用法尚在摸索中...


简单得出总结,Hibernate4的配置入口不再是Configuration对象,而是ServiceRegistry对象,Configuration对象将通过ServiceRegistry对象获取配置信息(官方说法是为了方便统一管理)。但是使用XML文件进行配置仍有不知名的问题,盼早日明晓。

以上见解仅仅是自己的一份学习笔记,希望能帮助到一些有同样疑惑的朋友,本人也只是刚开始学习Hibernate,其中肯定有不成熟与草率之处,希望各位看到的朋友多多交流指正,谢谢!


补充:

更正规与专业的用法可参照Hibernate 4.0源代码中Configuration#buildSessionFactory()的实现:


Java代码 复制代码 收藏代码
  1. public SessionFactory buildSessionFactory() throws HibernateException {
  2. Environment.verifyProperties( properties );
  3. ConfigurationHelper.resolvePlaceHolders( properties );
  4. final ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
  5. .applySettings( properties )
  6. .buildServiceRegistry();
  7. setSessionFactoryObserver(
  8. new SessionFactoryObserver() {
  9. @Override
  10. public void sessionFactoryCreated(SessionFactory factory) {
  11. }
  12. @Override
  13. public void sessionFactoryClosed(SessionFactory factory) {
  14. ( (StandardServiceRegistryImpl) serviceRegistry ).destroy();
  15. }
  16. }
  17. );
  18. return buildSessionFactory( serviceRegistry );
  19. }


分享到:
评论
5 楼 2012-09-01
谢谢lz了
4 楼 2012-03-06
ssqiang 写道
一方法:
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;

private static SessionFactory configureSessionFactory() throws HibernateException {
Configuration configuration = new Configuration();
configuration.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}

不错,谢谢
3 楼 2012-01-16
一方法:
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;

private static SessionFactory configureSessionFactory() throws HibernateException {
Configuration configuration = new Configuration();
configuration.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
2 楼 2011-12-29
你好,请问使用XML配制的方法找到了吗?
1 楼 2011-11-15
恩恩,不错!




*注:本文引自http://miniknife.iteye.com/blog/1260693
阅读(11256) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~