谈Hibernate之核心接口

来源:互联网 发布:淘宝直播怎么入驻 编辑:程序博客网 时间:2024/05/14 22:43

这是我根据所学总结的,希望能够对大家有所帮助



Configuration 实例化   SessionFactory

                                             实例化

                                            session

                                              实例化

                             Query  Criteria  Transaction

                                      Hibernate核心接口框图

1,Configuration类

 主要作用:读取配置文件、启动Hibernate的配置信息。一个应用程序只创建一个Configuration对象。

 常用的操作方法:


①,  configure()方法 

Configuration config = new Configuration.configure();

调用它后,Hibernate会自动在当前的CLASSPATH所指定的路径下查找XML配置文件Hibernate.cfg.xml,将其内容加载到内存中。

该方法还可以传入参数。当需要指定自定义配置文件的路径时,可使用如下代码:

File file = new File("c:\\hibernate.xml");Configuration config = new Configuration.configure(file);

还可以直接在参数中传递路径值。


②,  Configuration类中还提供了可动态地对配置参数进行修改的方法。

   加载多个自定义的XML文件:

Configuration cfg = new Configuration().addResource("h1.hbm.xml").addResource("h2.hbm.xml');//还可以使用addClass方法指定被映射的类,Hibernate会自动搜索到需要的映射文件


③,  调用setProperty方法动态配置属性的值

  还可以通过将java.util.Properties实例传入Configuration.setProperties();

 

总结:当调用Configuration 实例建立了SessionFactory实例后,配置信息便和SessionFactory实例建立了联系,当后续修改Configuration实例的配置属性时,不会影响到之间创建的SessionFactory实例。Configuration实例是启动时期的对象,创建完SessionFactory实例后,它的任务就完成了。




2,SessionFactory接口

SessionFactory接口负责Hibernate初始化,它作为数据源代理,负责建立Session对象。在Hibernate中,SessionFactory实际上起到了一个缓冲区的作用,它是线程安全的,它的同一实例可以提供给多个线程共享;它也是重量级的,不能随意创建和销毁它的实例。当项目中要操作多个数据库时,必须为每一个数据库指定一个SessionFactory。

创建SessionFactory实例:

Configuration cfg = new Configuration.configure();SessionFactory sessionFactory = cfg.buildSessionFactory();

 常用的SessionFactory的方法

① getCurrentSession()和openSession() 创建session实例

  getCurrentSession创建的实例会被绑架到当前的线程中,在提交或回滚操作后自动关闭;openSession方法是SessionFactory直接创建一个新的session实例 ,在使用完成后需要调用close()方法手动地关闭。

 当使用getCurrentSession方法创建session时,需要在hibernate.cfg.xml配置文件中添加如下配置:

<property name="hibernate.current_session_context_class">thread</property>   //使用本地事务时<property name="hibernate.current_session_context_class">jta</property>  //使用全局事务时

3,Session接口
 在相应的数据库中完成各种数据操作,是持久化操作的核心,也被称为持久化管理器,它的生命周期是随着Transaction对象的事务开始和结束为边界的。
  特点:
    不是线程安全的,应避免多个线程共享一Session实例(一般使用ThreadLocal线程局部变量来保存Session)
    实例是轻量级的,实例的创建和销毁不需要太多的资源
    有一个缓存,即Hibernate的第一级缓存,用于存放当前工作单元加载的对象
 
 常用的Session方法
 
为了更好地理解Session中的各种方法,先介绍实体对象生命周期的概念,即Hibernate中的实体对象在整个应用中的存在状态。

  瞬时态(Transient) 、持久态(Persistent) 、游离态(Detached) 同一个实体对象进行不同的操作后其状态会在上述三种状态中进行转换。利用代码进行分析说明:
//创建瞬时态对象User user = new User();user.setName("张三");//user对象处于瞬时态Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();//开启事务,user对象仍为瞬时态session.save();//调用save方法持久化user对象,user对象转换为Persistent状态tx.commit;session.close();  //关闭session//此时,user处于游离态

①save()方法
  将对象加入到缓存中,同时标识为presistent状态,根据映射文件中的配置信息生成实体对象的唯一标识符,生成计划执行的INSERT语句(等到事务结束或者此操作为后续操作的前提下才会执行INSERT语句)。

 当<generatror>(即assigned值)元素指定了可使用自定义的标识符作为记录的主键值,可利用重载方法save(Object object,Serializable id)来实现
对处在persistent状态的实体对象,调用save()方法是没有意义的。

②update()方法 根据对象的标识符更新持久化对象相应的数据 
  执行update方法时需要自己手动设置id属性值  以便在执行的sql语句中插入where后面



③saveOrUpdate()方法   依据对象的不同状态执行不同的操作

  根据实体对象的状态由Hibernate来决定到底执行save()方法还是update()方法,当传入的实体对象是Transient状态时,执行save()操作;当传入的实体对象是Detached状态时,则执行update()操作;当传入的实体是persistent状态时直接返回,不进行任何操作
 当用户的id属性为空时,执行save操作,当id属性不为空时,将执行update操作


④delete()方法  删除实例所对应的数据库中的记录


⑤get()和load()方法   通过标识符得到指定类的持久化对象

  当持久化对象不存在时,load()方法会抛出异常,get()方法会返回null;

  load方法可以返回实体类的代理类实例,即当映射文件中的class元素的lazy属性设置为true时(延迟加载)

 代理类仅仅只有id属性不为空值,只有当代理类实例调用getXXX()方法时,Hibernate才真正地到数据库中获得属性值。

   都是先从Session的内部缓存中开始查找指定实体对象,如果没有找到,则load()方法会查询Hibernate的二级缓存,然后再到数据库中进行查询,而get()方法会越过二级缓存直接发出sql语句到数据库中完成数据的读取


⑥contains()方法   判断一个实体对象是否与当前的session实例相关联,也即判断实体对象是否处于Persistent状态

⑦evict()方法  移除缓存中实体对象与Session实例之间的关联关系来清除指定的对象,执行该方法以后,实体对象由持久态转变为游离态。一般与contains()方法结合使用

⑧查询的方法,获取持久化对象

    creatQuery()方法  使用HQL语言进行数据库的查询

    creatCriteria()方法   可设置条件来进行查询

    creatSQLQuery()方法 使用标准的SQL语句来进行查询

⑨creatFilter()方法  用于一个持久化集合或者数组的特殊的查询,查询的字符串中可以使用this关键字来引用集合中的当前元素


4, Transaction接口 管理事务


 在配置文件中可以选择使用本地事务或全局事务 还可以对隔离级别进行设定(1,2,4,8)

    本地事务只针对一个数据库进行操作,而全局性事务由应用服务器进行管理,它需要使用JTA,可以用于多个事务性的资源。


<property   name="hibernate.current_session_context_class">thread</property><!--本地事务--><property   name="hibernate.current_session_context_class">jta</property><!--全局事务--><property name="hibernate.connection.isolation">4</property><!--隔离级别-->


 commit() 事务提交  rollback()事务回滚方法


5,Query接口
























0 0
原创粉丝点击