Hibernate内步运行机制详解

 
Session接口,是Hibernate框架的运行中心,它被用户程序调用,提供与持久化相关的诸多操作,如加载、添加、查询、更新和删除持久化对象,是实现用户程序持久化工作的主要接口,所以Session被称为持久化管理器。
  Transaction接口,是用来指定原子操作的单元范围,它通过对底层具体的JDBC、JTA等事务进行封装和抽象,形成一个统一的事务操作界面。
  此外,Hibernate还有两个重要的核心接口:Configuration接口和Query和Criteria接口。Configuration接口是用来对Hibernate配置和启动。Query和Criteria接口是用来执行对数据库的查询,且支持HQL、SQL多种查询方式,其中HQL是一种面向对象的查询语言。

hibernate 核心接口:
Session , Transaction , Query , Configuration
1.
 Configuration: 配置,根启动Hibernate 创建SessionFactory 对象
 例如   SessionFactory sf=new Configuration().configure().buidSessionFactory();
2.
 SessionFactory : 初始化Hibernate 创建Session 对象
 例如   Session session=sf.openSession();
3.
 Session : 负责保存,更新,删除,加载和查询对象
4.
 Transaction : 管理事物
5.
 Query和Criteria : 执行数据库查询
 例如: Query query=session.createQuery("from Customer c where c.name=:name");
 query.seParameter("name","tom",Hibernate.String);
Session 接口方法:
save();
updata();
delete();
load();
find();
Session 通过SessionFactory.opensession()方法获得;
控制事物一起Transaction
 Session session=SessionFactory.openSession();
 Transaction tx=null;
 try{
  tx=session.begionTrasaction();
  //逻辑方法
  tx.commit();
 }catch(Exception e){
  e.printStackTace();
  if(tx!=null)
  tx.rollback();
  thows e;
 }finlly{
  session.close();
 }

 //session.save(customers);执行下列SQL语句:
 insert into CUSTMERS(ID,NAME,EMAIL,PASSWORD,PHONE,ADDRESS,SEX,IS_MARRIED,DESCRIPTION,IMAGE,BIRTHDAY,REGISTERED_TIME) values(1,'TOM','1234',555566666,'SHANGHAI','M',0,'I AM VERY HONEST'#,'1980-05-06',NULL);

 //session.find("from customer as c order by c.name asc")执行下列SQL语句:
 select * from CUSTOMERS order by name asc;

 //(customer)session.load(customer.class,customer_id)执行下列SQL语句:
 select * from CUSTOMERS where ID=1;
 update CUSTOMERS set NAME='Tom',EMAIL='tom@yahoo.com',ADDRESS='beijing' where ID=1;

 //session.delete("from CUSTOMER as c");执行下列SQL语句
 select * from CUSTOMERS;
 delete from CUSTOMERS where ID=1;
 或者是: session.load(customers.class,id);
  session.delete(customer);
 或者是: session.load(customers.class,new int(1));
/映射对象标识符
     Hib中的标识符来建立内存中的对象和数据库表中记录的对应关系,对象的OID和数据库表的主键对应。为了保证OID的唯一性和不可变性,应该让Hib给OID赋值。
     /映射一对多关联关系
     在关系数据库中,只存在外键参照关系,而且总是由many方参照one方。为了消除数据冗余,关系性数据库只能支持多对一或是一对一的单向关联。
     /操作持久化对象
     session的实体对象状态分为三种:游离对象,持久化对象,临时对象
     临时对象 :不处于session的缓存中,不和任何的session实例关联,数据库中无记录。
            例:order o = new order();通过new刚刚创建的java对象处于临时状态
                session的delete方法使游离态,持久化的对象转变为临时状态
     持久化对象:位于session的缓存中,总是被一个session实例关联,和数据库中记录对应
                session的save方法使临时态变为持久化
                session的load,get方法返回对象总是处于持久化状态
                session的find方法返回list存放的都是持久化对象
                session的update,saveOrUpdate,lock方法使游离态转换为持久态对象
                一个持久化对象和临时对象有级联保存的时候session在清空缓存的时候会
                把临时对象转化为持久对象
     游离态对象:不位于session的缓存中,不被session关联,数据库中可能有记录
                session的close方法使缓存清空,缓存中的所有持久化对象变为游离态
                session的evict方法从缓存中删除一些持久化对象,不推荐使用应该通过
                查询语句来控制对象的深度。
          
     session的保存,更新,删除和查询
     保存:session.save();
       customer c = new coustomer();
       c.setid(new log(9)) ;
       c.setname ("tom");
       session s = sessionF.opensession();
       transaction tx = s.beginTransaction();
       s.save(c);
       tx.commit();
       session.close();
 
       如果想改变OID的值应使用save的重载save(customer,new long(9));不推荐使用
 
       save方法是当session清理缓存时才会执行insert语句,如果在save以后又对对象进行    修改session会再执行一次update操作。
       如果save方法已执行不能修改其OID属性。
     更新:session.update();
       customer c = new customer();
       c.setname("tom");
       session s = sessionF.opensession();
       Transaction tx = s.beginTransaction();
       s.save(c);
       tx.commit();
       session.close();//游离态
       c.setname("too");
       session2.update(c);
       session2.close();//使session2和c关联都会执行一次update修改操作。
 
      session的saveOrUpdate方法同时包含了save和update方法,如果传入的是临时对象调   用save方法,如果传入是游离态就调用update方法如果传入是持久化,就直接返回。
     查询:session的load,get和find方法
       session的load和get方法根据给定的OID从数据库中加载一个对象,load方法在没有找   到对象时抛出notFoundException异常,get方法返回null。
       get和load和其他查询方法返回的对象位于session的缓存中,修改了对象的属性后,   session清理缓存时,会根据持久化对象的属性来更新数据库。
       list CUSTOMER = SESSION.FIND("FROM CUSTOMER AS C WHERE C.ID = 1")返回关于 customer的一个集合。
     删除:session.delete方法,由于从数据库中删除对象对应的记录,如果出入的是持久化对象session就计划执行一个delete语句。如果出入的参数是游离态对象,先使它成为持久化对象,然后计划执行一个delete语句。session只有在清理缓存的时候才会执行delete语句。只有当调用session的close()方法时才会从session的缓存中删除对象。
       session.delete("from customer as c where c.id > 8") ;
     /session的检索机制 load(),get(),find();
     用来对数据库中检索对象,load()和get()方法按照给定的OID加载一个持久化对象,find方法按照参数指定的HQL语句加载一个或多个持久化对象
     CUSTOMER C = (CUSTOMER)SESSION.LOAD(CUSTOMER.CLASS,NEW LOAG(1));
     CUSTOMER C = (CUSTOMER)SESSION.GET(CUSTOMER.CLASS,NEW LOAG(2));
     LIST CUSTOMER = SESSION.FIND("FROM CUSTOMER AS C WHERE C.ID = 1");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值