配置好了Hibernate之后,我们就可以开始载入和存储的工作了。首先,我们需要启动Hibernate。启动Hibernate的第一步就是创建一个SessionFactory,通常我们将创建一个全局变量并保存下来,以后可以随时访问。SessionFactory可以开始新的session。SessionFactory是线程安全的,可以被多个线程共享,因此我们只需要一个SessionFactory的实例;但是Session不是线程安全的,一个Session只应该被一个线程使用。我们创建一个帮助类HibernateUtil来负责启动和访问SessionFactory。 package util; import org.hibernate.*; import org.hibernate.cfg.*; public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { // Create the SessionFactory from hibernate.cfg.xml sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (Throwable ex) { // Make sure you log the exception, as it might be swallowed System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } 上面的代码中,最核心的代码是 sessionFactory = new Configuration().configure().buildSessionFactory(); 当调用new Configuration()的时候,Hibernate在classpath的根路径中搜索hibernate.properties文件。如果找到了,该文件中的所有的属性都会被添加到Configuration对象中。我们已经学习过,配置Hibernate的时候,可以使用properties文件,也可以使用xml文件。当调用configure()方法的时候,Hibernate会在classpath的根路径中搜索hibernate.cfg.xml文件,如果找不到,就会抛出异常。如果我们没有采用xml文件配置的方式,可以不调用这个方法。如果properties文件和xml文件都存在,那么调用了configure()方法后,xml文件中的设置将会覆盖properties文件中的设置。如果你的xml文件不叫hibernate.cfg.xml,或者该文件不在classpath的根路径,而在其子目录中,那么在调用configure()方法的时候,可以将该文件的路径作为参数,例如 New Configuration().configure("/persistence/auction.cfg.xml"); 在buildSessionFactory()之前,都可以在程序中设置hibernate的属性,例如 new Configuration().configure().setProperty(Environment.DEFAULT_SCHEMA,"ABC").addResource("auction/CreditCard.hbm.xml").buildSessionFactory(); 现在,我就可以使用Hibernate来载入和存储对象了。 package events; import org.hibernate.Session; import java.util.Date; import util.HibernateUtil; public class EventManager { public static void main(String[] args) { Session saveSession = HibernateUtil.getSessionFactory().openSession(); Transaction saveTx = saveSession.beginTransaction(); Event event = new Event(); event.setTitle("My Event"); event.setDate(new Date()); saveSession.save(event); saveTx.commit(); saveSession.close(); Session querySession = HibernateUtil.getSessionFactory().openSession(); Transaction queryTx = querySession.beginTransaction(); List events = querySession.createQuery("from event e").list(); System.out.println(events.size + " events found."); queryTx.commit(); querySession.close(); HibernateUtil.getSessionFactory().close(); } } 在上面的例子中我们演示了怎样从数据库中载入对象和想数据库中存储对象。我们首先来看存储对象的代码: Session saveSession = HibernateUtil.getSessionFactory().openSession(); Transaction saveTx = saveSession.beginTransaction(); Event event = new Event(); event.setTitle("My Event"); event.setDate(new Date()); saveSession.save(event); saveTx.commit(); saveSession.close(); 首先,我们通过SessionFactory获取了一个Session对象,并从该Session对象启动了一个Transaction。然后,生成了一个新的Event的实例,并调用session对象的save方法将该对象存储到数据库中,并提交Transaction。最后关闭该Session对象。 再来看看载入对象的代码: Session querySession = HibernateUtil.getSessionFactory().openSession(); Transaction queryTx = querySession.beginTransaction(); List events = querySession.createQuery("from event e").list(); System.out.println(events.size + " events found."); queryTx.commit(); querySession.close(); 对于Session和Transaction对象的操作,和存储对象的时候没有什么区别。最大的区别是载入对象的时候使用了Query对象。 querySession.createQuery()会生成一个Query对象,该方法的参数就是要执行的查询语句。大家可以看到,这里的查询语句和通常的SQL语句不太一样,这里使用的是Hibernate Query Language(HQL),虽然和SQL很类似,但是还是有一些区别。当然,这里也可以直接使用普通的SQL语句进行查询。生成了Query对象后,就可以调用该对象的list方法进行查询。该方法会返回一个List,List中的每个元素就是从数据库中载入的对象。