站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题Hibernate 中文参考手册(3)

Hibernate 中文参考手册(3)

摘要: Hibernate 中文参考手册(3)

更多资料请访问http://softtrade.vicp.net 1.4. 与猫同乐 我们现在可以开始Hibernate的Session了。我们用它来从数据库中存取Cat。首先,我们要从SessionFactory中获取一个Session(Hibernate的工作单元)。
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); SessionFactory负责一个数据库,也只对应一个XML配置文件(hibernate.cfg.xml)。
这篇教程的关注点在于配置Tomcat的JDBC连接,绑定到JNDI上,以及Hibernate的基础配置。你可以用喜欢的任何方式编写一个Servlet,包含下面的代码,只要确保SessionFactory只创建一次。也就是说你不能把它作为你的Serlvet 的实例变量。一个好办法是用在辅助类中用一个静态的SessionFactory,例如这样:
import net.sf.hibernate.*; import net.sf.hibernate.cfg.*;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static { try { sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (HibernateException ex) { throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage(), ex); } }
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException { Session s = (Session) session.get(); // Open a new Session, if this Thread has none yet if (s == null) { s = sessionFactory.openSession(); session.set(s); } return s; }
public static void closeSession() throws HibernateException { Session s = (Session) session.get(); session.set(null); if (s != null) s.close(); } } 这个类不但在它的静态属性中使用了SessionFactory,还使用了ThreadLocal来为当前工作线程保存Session。
Session不是线程安全的,代表与数据库之间的一次操作。Session通过SessionFactory打开,在所有的工作完成后,需要关闭:
Session session = HibernateUtil.currentSession();
Transaction tx= session.beginTransaction();
Cat princess = new Cat(); princess.setName("Princess"); princess.setSex('F'); princess.setWeight(7.4f);
session.save(princess); tx.commit();
HibernateUtil.closeSession(); 在Session中,每个数据库操作都是在一个事务(transaction)中进行的,这样就可以隔离开不同的操作(甚至包括只读操作)。我们使用Hibernate的Transaction API来从底层的事务策略中(本例中是JDBC事务)脱身。这样,如果需要把我们的程序部署到一个由容器管理事务的环境中去(使用JTA),我们就不需要更改源代码。请注意,我们上面的例子没有处理任何异常。
也请注意,你可以随心所欲的多次调用HibernateUtil.currentSession();,你每次都会得到同一个当前线程的Session。你必须确保Session在你的数据库事务完成后关闭,不管是在你的Servlet代码中,或者在ServletFilter中,HTTP结果返回之前。
Hibernate有不同的方法来从数据库中取回对象。最灵活的方式是使用Hibernate查询语言(HQL),这是一种容易学习的语言,是对SQL的面向对象的强大扩展。
Transaction tx= session.beginTransaction();
Query query = session.createQuery("select cat from Cat as cat where cat.sex = :sex"); query.setCharacter("sex", 'F'); for (Iterator it = query.iterate(); it.hasNext();) { Cat cat = (Cat) it.next(); out.println("Female Cat: " + cat.getName() ); }
tx.commit(); Hibernate也提供一种面向对象的按条件查询API,可以执行公式化的类型安全的查询。当然,Hibernate在所有与数据库的交互中都使用PrepatedStatement和参数绑定。
1.5. 结语 在这个短小的教程中,我们只描绘了Hibernate的基本面目。请注意我们没有在例子中包含Servlet相关代码。你必须自行编写Servlet,然后把你认为合适的Hibernate代码插入。
请记住Hibernate作为数据库访问层,是与你的程序紧密相关的。一般,所有其他层次都依赖持久机制。请确信你理解了这种设计的含义。
更多资料请访问http://softtrade.vicp.net
↑返回目录
前一篇: Hibernate技术(1)
后一篇: Hibernate 中文参考手册(2)