hibernate中的session操作

[size=large]

(附件中的blog.sql脚本添加了外键, 在执行非查询操作时可能会报错, 建议执行blog without foreign key.sql)

    web应用和hibernate中都有session, 它们都是对话, 但是浏览器与服务器之间的对话, 后者是程序和数据库之间的对话.

    先介绍几个hibernate中的基本类,在此基础之上再介绍利用session进行的基本数据操作.
 
API:
    Configuation, 用于加载hibernate.cfg.xml配置文件
     SessionFactory,用于创建session对象.
    Session,负责以对象方式对数据进行增(save(obj))、删(delete(obj))、改(update(obj))、查(load(), get())操作.

session操作:
     要利用session进行操作, 首先得获得session实例.附件中的HibernateUtil类是自己编写的,以较简单的方式封装了获得session的代码. 而HibernateSessionFactory是用Meclipse自动生成的, 不仅封装了获得session的代码, 还增加了线程单例特性.

    1.获得session实例
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static Session session;
    
    // 该过程要加载映射文件,是一个比较耗费资源的过程,所以放在静态代码块中执行
    static {
        Configuration config=new Configuration();
        config.configure("/hibernate.cfg.xml");
        SessionFactory sessionFactory=config.buildSessionFactory();
        session=sessionFactory.openSession();
    }
    
    public static Session getSession() {
        return session;
    }
}

2.查找:session查找有两种方法:load和get, 前者使用了延迟加载(后面会介绍), 后者没有.
   业务:查找id=1的Major, 输出名称.
   @Test
    public void testFindById(){
        Session session=HibernateUtil.getSession();
        
        //只能根据主键id查找
        //查找id=1的Major
        Major major=(Major) session.load(Major.class, 1);
        System.out.println(major.getName());
        
        //关闭session
        session.close();
    }



    查找操作不需要事务管理, 但增删改操作需要. Transaction类就是hibernate用于管理事务的类.

     3.添加
     业务:增加一个major:Chinese专业, 有100个学生.
 @Test
    public void testAdd(){
        Session session=HibernateUtil.getSession();
        Major major=new Major();
        major.setName("Chinese");
        major.setStuNum(100);
        
        //开启事务
        Transaction tx=session.beginTransaction();
        
        session.save(major);
        
        //提交事务
        tx.commit();
        session.close();
    }



    4.更新
     业务:将Chinese专业的人数改为150人

@Test
    public void testUpdate(){
        Session session=HibernateUtil.getSession();
        
        Major major=(Major) session.load(Major.class, 3);
        major.setStuNum(150);
        
        Transaction tx=session.beginTransaction();
        session.update(major);
        tx.commit();
    }


hibernate的session更新操作要先查找出需要更新的记录, 然后更改对象属性, 再调用update方法.若采用这样的更新方式:
        Major major =new Major();
        major.setId(3);
        major.setStuNum(150);
        ...
        session.update(major);
        则需要把对象所有的属性都设置好, 一个都不能落下, 否则在更新操作后没设置的属性就会被置空.若属性较多, 这种更新方法会非常麻烦.

    5. 删除
     业务需求:删除id=3的专业.
@Test
    public void delete(){
        Session session=HibernateUtil.getSession();
        
        //删除操作是根据主键id进行的, 不需要先查后删, 设置好id就行.
        Major major=new Major();
        major.setId(3);
        
        Transaction tx=session.beginTransaction();
        session.delete(major);
        tx.commit();
    }


增删改操作若没有调用事务, 操作无效.
下集预告:hibernate的延迟加载和对象状态.

[/size]

猜你喜欢

转载自keepcrazy.iteye.com/blog/1754707