Hibernate学习笔记(三)

来源:互联网 发布:李刚 疯狂java 编辑:程序博客网 时间:2024/05/16 17:39

五、加载并存储对象

我们可以使用 Hibernate 来加载和存储对象,编写一个带有 main() 方法的 EventManager 类:

package org.hibernate.tutorial;
 
import org.hibernate.Session;
 
import java.util.*;
 
import org.hibernate.tutorial.domain.Event;
import org.hibernate.tutorial.util.HibernateUtil;
 
public class EventManager {
 
    public static void main(String[] args) {
        EventManager mgr = new EventManager();
 
        if (args[0].equals("store")) {
            mgr.createAndStoreEvent("My Event", new Date());
        }
 
        HibernateUtil.getSessionFactory().close();
    }
 
    private void createAndStoreEvent(String title, Date theDate) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
 
        Event theEvent = new Event();
        theEvent.setTitle(title);
        theEvent.setDate(theDate);
        session.save(theEvent);
 
        session.getTransaction().commit();
    }
 
}

在这里,sessionFactory.getCurrentSession() 是干什么的呢?首先,只要你持有 org.hibernate.SessionFactory,大可在任何时候、任何地点调用这个方法。getCurrentSession() 方法总会返回当前的工作单元。我们在hibernate.cfg.xml 中把这一配置选项调整为 "thread"。因此,当前工作单元被绑定到当前执行我们应用程序的 Java 线程。但是,这并非是完全准确的,你还得考虑工作单元的生命周期范围(scope),它何时开始,又何时结束。

注意:Hibernate 提供三种跟踪当前会话的方法。基于线程的方法不适合于产品环境,它仅用于 prototyping 和教学用途。后面将更详细地讨论会话跟踪。

和工作单元的生命周期这个话题相关,Hibernate org.hibernate.Session 是否被应该用来执行多次数据库操作?上面的例子对每一次操作使用了一个 org.hibernate.Session,这完全是巧合,这个例子不是很复杂,无法展示其他方式。Hibernate org.hibernate.Session 的生命周期可以很灵活,但是你绝不要把你的应用程序设计成为每一次数据库操作都用一个新的 Hibernate org.hibernate.Session。因此就算下面的例子(它们都很简单)中你可以看到这种用法,记住每次操作一个 session 是一个反模式。

原创粉丝点击