ds.storeClass(Department.class); sessionFactory = ds.buildSessionFactory(); } catch (Exception e) { throw new RuntimeException(couldn't get connection); } }
在上述代码中,Datastore 对象通过调用 buildSessionFactory 方法获取 SessionFactory 的一个实例。如果没有给 buildSessionFactory 方法提供任何参数,它会在运行时类路径中查找缺省属性文件(即我们前面创建的 hibernate.properties 文件)查找。另一种办法是,如果在代码中需要对 properties 进行这种控制,可以将 Properties 对象传递给 buildSessionFactory 方法。
在该静态的初始化程序初始化 SessionFactory 对象之后,我们就可以调用 openSession() 方法。这个静态方法将为我们返回一个新的会话对象。如果您调用 openSession 时没有提供参数,SessionFactory 将为您自动管理 Connection。许多连接参数(如池的大小、语句高速缓存以及空闲时间)都可以通过 hibernate.properties 文件中的参数(或提供给 SessionFactory 的 properties 对象)进行配置。有关更多详细信息,请参阅 Hibernate 文档。
如果您的程序已经有一个现有的连接管理基础结构,那么您可以给 openSession(Connection con) 方法提供一个连接,Hibernate 将使用您提供的连接。
操作数据库对象
这一节描述如何写到数据库中,如何从数据库装入对象以及如何更新和查询数据库。
写到数据库 要写到数据库,我们将使用 SessionFactory 对象打开一个新的会话。然后,我们将创建想持久保存的对象并将它保存到会话中。接着,我们刷新(flush)会话,在连接上调用提交(commit),最后关闭(close)会话。
刷新会话会强制 Hibernate 把内存中的数据和数据库同步起来。Hibernate 将定期自动刷新,但不能保证在什么时候进行。于是,我们将内存中的数据显式刷新到数据库,从而确保数据立即写入数据库。
在关闭会话之前,还必须确保提交了数据库连接。
Session session = sessionFactory.openSession();
department = new Department(); department.setCity(Austin); department.setState(TX); department.setName(IBM Global Services); department.setDepartmentID(211);
session.save(department); session.flush(); session.connection().commit(); session.close();
从数据库装入对象 装入对象就是使用对象的标识将对象调回到内存中的过程。这与我们在查询数据库中讨论的查询对象不同。
为了从数据库装入对象,我们同样需要一个会话。我们还需要想装入的对象的主键。就我们前面所编写的示例来说,如果想将 Department 装回到对象中,我们可以用表示 Department 的 Class 对象来调用 session.load 方法,我们的主键是“211”。
Session session = sessionFactory.openSession();
Department dept = (Department) session.load(Department.class, new Integer(211)); session.close();
更新数据库 要更新一个对象,可以在创建该对象的那个会话中进行,也可以在一个完全不同的会话中进行。在同一个会话中更新对象很容易;只要修改对象的状态就行了。要在不同的会话中更新对象,则必须装入(或查询)该对象,然后更新它。
同一个会话
session.save(department); session.flush(); department.setName(newName); session.flush();
不同的会话
first session Department department = new Department(); department.setDepartmentId(211); department.setName(someName); . . set other stuff on department .
session.save(department); session.flush(); session.connection().commit(); session.close();
later session laterSession = sessionFactory.openSession(); Department dept = (Department) session.load(Department.class, new Integer(211)); dept.setName(aDifferentName); laterSession.flush(); session.connection().commit(); laterSession.close();
查询数据库
查询数据库有几种方式。最简单的方式是使用 session.find 方法。您必须使用 Hibernate 简单但却功能强大的面向对象的查询语言来给 session.find 提供一个查询。下面的示例演示了一个非常简单的查询。如果要进行更复杂的查询,请参阅 Hibernate 文档获取更多详细信息。
Department department = new Department(); department.setDepartmentId(211); department.setName(someName); . . set other stuff on department .
session.save(department); List list = session.find (from dept in class com.ibm.hibernate_article.Department where dept.city='Austin' );
进行测试
既然我们有了会话对象并且知道了如何进行一些操作,那我们就可以在我们简单的对象模型上编写一些 CRUD 测试来看看 Hibernate 的实际运行情况。这是一种比 JUnit 测试好得多的测试方法。您可以随意看看本文所附的源代码中的 HibernateTest.java 测试用例。
结束语
在本文中,我们仅仅粗浅地讨论了如何使用 Hibernate。我们在几个 POJO(Plain Old Java Object,传统的 Java 对象)的上下文中介绍 Hibernate API。不过,请注意广泛的 Hibernate API 涵盖了更高级的主题,如 one-to-many(一对多)映射、事务以及集合。既然您已“涉足”Hibernate,那应该能更自在地探索如何在编程工作中使用开放式源代码产品了吧。 我们在一些项目中使用了 Hibernate,使用时遇到了一些障碍。我们发现,SourceForge 上的 Hibernate 论坛对于解答我们的问题是不可或缺的。在该论坛上,Hibernate 的主要开发人员非常活跃,他们几乎会解答所有贴子。 论坛的网址为: httpsourceforge.netforumforum.phpforum_id=128638 Hibernate Web 页面的网址: httphibernate.bluemars.net
关于作者
Javid Jamae 是一位专攻企业应用程序和软件方法学咨询的独立软件顾问。您可以通过 javidjamae@yahoo.com 与 Javid 联系。 Kulvir Singh Bhogal 的工作角色是 WebSphere 顾问,在全美实施 IBM 的电子商务战略。您可以通过 kbhogal@us.ibm.com 与 Kulvir 联系。
上一页 [1] [2] |