hibernate4.0 中buildSessionFactory()新方式解惑

这段时间刚开始学习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的方式:

Configuration config = new Configuration();
		SessionFactory sf = config.buildSessionFactory(
						new ServiceRegistryBuilder()
						.configure()
						.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进行配置,修改代码如下:

	Configuration config = new Configuration();
		SessionFactory sf = config.buildSessionFactory(
						new ServiceRegistryBuilder()
						.buildServiceRegistry());

运行测试通过!

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


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

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

 

补充:

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

	public SessionFactory buildSessionFactory() throws HibernateException {
		Environment.verifyProperties( properties );
		ConfigurationHelper.resolvePlaceHolders( properties );
		final ServiceRegistry serviceRegistry =  new ServiceRegistryBuilder()
				.applySettings( properties )
				.buildServiceRegistry();
		setSessionFactoryObserver(
				new SessionFactoryObserver() {
					@Override
					public void sessionFactoryCreated(SessionFactory factory) {
					}

					@Override
					public void sessionFactoryClosed(SessionFactory factory) {
						( (StandardServiceRegistryImpl) serviceRegistry ).destroy();
					}
				}
		);
		return buildSessionFactory( serviceRegistry );
	}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一些关于在Hibernate创建Java项目的指导。 步骤如下: 1. 创建Java项目 首先,您需要在您的开发环境创建一个的Java项目。您可以使用Eclipse、NetBeans或IntelliJ IDEA等集成开发环境来创建项目。 2. 添加Hibernate依赖 在项目添加Hibernate依赖,以便能够使用Hibernate框架。您可以使用Maven或Gradle等构建工具来管理项目依赖。 例如,在Maven项目,您可以在pom.xml文件添加以下依赖: ``` <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.4.32.Final</version> </dependency> ``` 3. 配置Hibernate 在项目配置Hibernate,以便能够连接到数据库并执行数据库操作。您需要创建一个Hibernate配置文件,指定数据库连接信息、映射文件等。 例如,在Hibernate,您可以创建一个名为“hibernate.cfg.xml”的配置文件,并在其指定以下信息: ``` <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydatabase</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">password</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <mapping resource="com/example/MyEntity.hbm.xml"/> </session-factory> </hibernate-configuration> ``` 4. 创建实体类 在项目创建实体类,以便能够将Java对象映射到数据库表。您需要使用Hibernate注解或XML文件来指定实体类与数据库表之间的映射关系。 例如,在Hibernate,您可以创建一个名为“MyEntity”的实体类,并在其指定以下注解: ``` @Entity @Table(name = "my_table") public class MyEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; // getters and setters } ``` 5. 编写DAO层 在项目创建DAO层,以便能够执行数据库操作。您需要使用Hibernate API来执行CRUD操作。 例如,在Hibernate,您可以创建一个名为“MyEntityDAO”的DAO类,并在其编写以下代码: ``` public class MyEntityDAO { private SessionFactory sessionFactory; public MyEntityDAO(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public MyEntity findById(Long id) { Session session = sessionFactory.getCurrentSession(); return session.get(MyEntity.class, id); } public void save(MyEntity entity) { Session session = sessionFactory.getCurrentSession(); session.save(entity); } public void update(MyEntity entity) { Session session = sessionFactory.getCurrentSession(); session.update(entity); } public void delete(MyEntity entity) { Session session = sessionFactory.getCurrentSession(); session.delete(entity); } } ``` 6. 测试应用程序 最后,您可以编写一个简单的测试类,以便测试应用程序是否正常工作。 例如,在Hibernate,您可以编写一个名为“TestHibernate”的测试类,并在其编写以下代码: ``` public class TestHibernate { private static final SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); public static void main(String[] args) { MyEntityDAO dao = new MyEntityDAO(sessionFactory); MyEntity entity = new MyEntity(); entity.setName("John Doe"); dao.save(entity); MyEntity savedEntity = dao.findById(entity.getId()); System.out.println(savedEntity.getName()); savedEntity.setName("Jane Doe"); dao.update(savedEntity); dao.delete(savedEntity); } } ``` 这就是在Hibernate创建Java项目的基本步骤。希望这能对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值