ITEEDU

Hibernate Gossip: Session

Hibernate在对数据库进行操作之前,必须先取得Session实例,相当于JDBC在对数据库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计为执行绪安全(Thread-safe),一个Session由一个执行绪来使用。

Session实例由SessionFactory开启获得,例如:
Configuration config = new Configuration().configure();
      SessionFactory sessionFactory = config.buildSessionFactory();
      Session session = sessionFactory.openSession();
      ....
      session.close();
透过Session,可以对数据库进行新增、删除、更新,例如使用save()新增一笔数据:
User user = new User(); 
      user.setName("momor");
      user.setAge(new Integer(26)); 
      session.save(user); 
使用get()或load()方法取得id为1的数据:
User user = (User) session.get(User.class, new Integer(1));
如果未能发现相符合的数据,则get()方法会返回null,而load()方法会丢出ObjectNotFoundException,在进阶的应用中,load()方法可以返回代理对象,并可充分利用缓冲机制。

在Hibernate 3中,取消了find()方法,您必须透过Query或Criteria来进行数据查询。

接下来看看使用Session更新与删除数据,可使用delete()删除数据:
User user = (User) session.get(User.class, new Integer(1));
      session.delete(user);
如果您开启了一个Session,从数据表中取出数据显示到使用者接口上,之后关闭Session,当使用者在接口上操作完毕并按下储存时,这时您要重新开启一个Session,使用update()方法将对象中的数据更新至对应的数据表中:
 User user = (User) session.get(User.class, new Integer(2));
session.close();
....
user.setAge(new Integer(27));
session = sessionFactory.openSession();    
Transaction tx= session.beginTransaction(); 
session.update(user);
tx.commit();
session.close();
Session提供了一个saveOrUpdate()方法,为数据的储存或更新提供了一个统一的操作接口,藉由定义映像文件时,设定<id>标签的unsaved-value来决定什么是新的值必需,什么是已有的值必须更新:
<id name="id" column="id" type="java.lang.Integer" unsaved-value="null">
          <generator class="native"/> 
      </id> 
unsaved-value可以设定的值包括:
  • any:总是储存
  • none:总是更新
  • null:id为null时储存(预设)
  • valid:id为null或是指定值时储存
这样设定之后,您可以使用Session的saveOrUpdate()方法来取代update()方法。