hibernate(1)

1. Hibernate是对JDBC进一步封装
原来没有使用Hiberante做持久层开发时,存在很多冗余,如:各种JDBC语句,connection的管理,所以出现了Hibernate把JDBC封装了一下,我们不用操作数据,直接操作它就行了。
2. 我们再从分层的角度来看
我们知道非常典型的三层架构:表示层,业务层,还有持久层。Hiberante也是持久层的框架,而且持久层的框架还有很多,比如:IBatis,Nhibernate,JDO,OJB,EJB等等。
3. Hibernate是开源的一个ORM(对象关系映射)框架。
  ORM,即Object-Relational Mapping,它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。这样,我们在操作数据库的时候,不需要再去和复杂SQL打交道,只要像操作对象一样操作它就可以了(把关系数据库的字段在内存中映射成对象的属性)
4. Hibernate的核心类和接口
  Hibernate的核心类和接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心类和接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这6个核心接口和类分别加以介绍。
1. Session
   Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。 

    Java应用程序与hibernate之间的主要运行时接口。它是抽象了持久化服务概念的核心抽象API类。
    Session的生命周期绑定在一个物理的事务(tansaction)上面。(长的事务可能跨越多个数据库事物。):
 Session sess = factory.openSession();
 Transaction tx;
 tx = sess.beginTransaction();
    Session的主要功能是提供对映射的实体类实例的创建,读取和删除操作。实例可能以下面三种状态存在:

    自由状态(transient): 不曾进行持久化,未与任何Session相关联
    持久化状态(persistent): 仅与一个Session相关联
    游离状态(detached): 已经进行过持久化,但当前未与任何Session相关联

    对实例的操作:
    游离状态->持久化状态:save()、persist()或者saveOrUpdate()
    持久化状态->游离状态:delete()
    任何状态->持久化状态:get()或load()

    save()和persist():SQL的INSERT
    delete():SQL DELETE
    update()或merge():SQL UPDATE
    saveOrUpdate()或者replicate():SQL INSERT或者UPDATE。

    其具体实现并不一定是线程安全的,即一个Session实例同时只可由一个线程使用。同一个Session实例的多线程并发调用将导致难以预知的错误。每个线程/事务应该从一个SessionFactory获取自己的session实例。如果其持久化对象类是可序列化的,则Session实例也是可序列化的。
2. SessionFactory
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
比如在db层定义一个静态的sessionFactory,调用Configuration接口,并根据configure创建sessionFactory,后面就可以使用了:
private static SessionFactory factory;
static {
    @SuppressWarnings("deprecation")
    Configuration config = new AnnotationConfiguration().configure("hibernate.cfg.xml");  
    //初始化Hibernate配置管理类Configuration
    factory = config.buildSessionFactory();
    //通过Configuration类实例创建Session的工厂类SessionFactory。
    //或者合成一步:factory=new Configuration().configure("hsp.cfg.xml").buildSessionFactory();
    }
     public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }
    //通过SessionFactory得到Session实例。
    Configuration实例config会根据当前的数据库配置信息,构造SessionFacory实例并返回。SessionFactory一旦构造完毕,即被赋予特定的配置信息。也就是说,之后config的任何变更将不会影响到已经创建的SessionFactory实例sessionFactory。如果需要使用基于变更后的config实例的SessionFactory,需要从config重新构建一个SessionFactory实例。
    SessionFactory保存了对应当前数据库配置的所有映射关系,同时也负责维护当前的二级数据缓存和Statement Pool。由此可见,SessionFactory的创建过程非常复杂、代价高昂。这也意味着,在系统设计中充分考虑到SessionFactory的重用策略。由于SessionFactory采用了线程安全的设计,可由多个线程并发调用。
3. Transaction
    Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
   例如以下语句:
Session session = getLocalThreadSession();
Transaction transaction = null;
transaction = session.beginTransaction();
...
transaction.commit();
if (transaction != null)
    {transaction.rollback();}
    //如果Session抛出了异常, 事务必须回滚而session会被废弃。在异常发生后Session的内部状态可能会与数据库失去同步。
4. Query
    Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
    在Hibernate 2.x中,find()方法用于执行HQL语句。Hibernate 3.x废除了find()方法,取而代之的是Query接口,它们都用于执行HQL语句。Query和HQL是分不开的。如:
    Query query=session.createQuery(“fromtable where id=1”);
    而使用以下语句:
    Query query=session.createQuery("fromtable whereid=?");
    就要在后面设置其值:
    Query.setString(0,"要设置的值");
    上面的方法是通过“?”来设置参数,还可以用“:”后跟变量的方法来设置参数,如上例可以改为:
    Query query=session.createQuery("fromtable whereid=:1");
    Query.setString("kchValue","要设置的课程号值");
    其使用方法是相同的,例如:
    Query.setParameter(0,"要设置的值");
    Query还有一个list()方法,用于取得一个List集合的示例,此示例中包括可能是一个Object集合,也可能是Object数组集合。例如:
    Query query=session.createQuery("fromtable whereid=1");
    List list=query.list();
    具体设计hql语言见hibernate(2)。
5. Criteria
    Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
6. Configuration
    Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。
    Configuration负责管理Hibernate的配置信息。Hibernate运行时需要一些底层实现的基本信息。这些信息包括:数据库URL、数据库用户名、数据库用户密码、数据库JDBC驱动类、数据库dialect。用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现,如Hibernate数据库类型到特定数据库数据类型的映射等。
    使用Hibernate必须首先提供这些基础信息以完成初始化工作,为后续操作做好准备。这些属性在Hibernate配置文件hibernate.cfg.xml中加以设定,当调用:   
    Configuration config=new Configuration().configure();
时,Hibernate会自动在目录下搜索hibernate.cfg.xml文件,并将其读取到内存中作为后续操作的基础配置。

原文链接1,具体Session方法及作用

原文链接2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值