hibernate入门知识

<div class="iteye-blog-content-contain" style="font-size: 14px"></div>

        1.Hibernate 讲解内容:

1.Hibernate简介
2.Hibernate开发流程
3.Hibernate配置文件
4.Hibernate核心接口和类
5.HibernateORM映射
6.HQL
7.Hibernate懒加载机制和抓取策略
8.Hibernate缓存
9.Hibernate锁机制

 2.Hibernate是作用在持久层的ORM开源框架,底层是JDBC编写的(O是object对象,R是relation关系,M是mapping映射)。ORM是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单说ORM

是通过使用描述对象和数据之间映射的元数据(*.hbm.xml)将java程序中的对象自动持久化到数据库中。本质就是将数据从一种形式转换成另一种形式。

 

3.Hibernate是帮助我们利用面向对象的思想开发基于关系型数据库的应用程序。

4.Hibernate中若关系式一对一,外键设在次要的或者后产生的一方,若是一对多的关系外键设置多的一方。

5.类的关系式继承关系的,转成hibernate的表关系是一对一关系。

6.创建Hibernate项目所需jar包:

 7.配置cfg.xml:

 8.测试数据库链接:用junit插件测试的.

 

9.SessionFactory和Configuration

  • SessionFactory是线程安全的,一个数据库对应一个SessionFactory,生命周期长,一般在整个系统生命周期内有效;SessionFactory保存着和数据库连接的相关信息(user,password,url)和映射信息,以及Hibernate运行时要用到的一些信息。
  • SessionFactory是产生Session的工厂 
  • SessionFactory维护二级缓存
  • 工厂初始化代码:

       Configuration cfg = new Configuration();

       cfg.configure(“config.cfg.xml”);

       也可以通过cfg.setProperty设置属性。

        SessionFactory sessionFactory = cfg.buildSessionFactory();   

10.Session:

  •  Session是非线程安全的,生命周期较短,代表一个和数据库的连接,在B/S系统中一般不会超过一个请求;内部维护一级缓存和数据库连接,如果session长时间打开,会长时间占用内存和数据库连接。
  • Session的几个主要方法:

       1.save,保存对象

2.delete,删除对象

3.update,更新对象,如果数据库中没有记录,会出现异常。

4.get,根据ID查,会立刻访问数据库。

5.Load,根据ID查,(返回的是代理,不会立即访问数据库)。

11.po和映射文件:

  •  开发流程

1由po-> mapping->db。(官方推荐)

2由DB开始,用工具生成mapping和po。(使用较多)

3由映射文件开始。

  • po类

       1.默认的构造方法(必须的)。

2.有无意义的标示符id(主键)(可选)

3.非final的,对懒加载有影响(可选)

      

 public class User {
         private int id;
         private String name;
         private Date createTime;
     
               public User(){}
      //getter setter…
        }

     *.hbm.xml

<?xml version="1.0"?>
<hibernate-mapping package=“com.puckasoft.po">
<class name="User" table="user">
<id name="id">
<generator class="native"/>//native表示自增
</id>
<property name="name"/>
<property name=“createTime”
column=“create_time”/>
</class>
</hibernate-mapping>

 

 

12.创建好po类和映射文件---》导表(在数据库中创建表)



 13.单表的数据保存例子:

 若是不想让某个字段插入,可以在hbm.xml中配置中<property name="name"  insert=“false” /> 字段的property 标签中 的insert属性值改为false,默认是false。

14.update 数据例子:

把 回去session对象的方法封装起来,把sessionfactory写成单利模式:



 

1)当更新数据在数据中不存在,就是更新失败是会报异常:


意思是:批量跟新返回不期望的行数,实际更新0行,期望是1行。

2)若更新的那条数据存在但是对象只给要改变的那个属性赋值了,更新的结果是其他没赋值的字段也会被跟新,它们会根据默认值跟新字段。

3)若某个字段不允许更新可以在对应的.hbm.xml文件中对应的property标签中加上update属性把值改为“false”,当更新数据时这个字段不会更新。

15.delete操作例子:



 当删除的数据id在数据库中不存在,会跑一个异常和update时的异常一样的。

16.get方法和load方法的区别:



 


  •  load支持懒加载机制,而get方法不支持懒加载(load方法是在使用对象时发送的sql语句,get方法是在get方法是就发送sql语句),get方法是返回的po类,load方法返回的是cglib的代理类,增强po类的功能可以自己发送sql.
  • get方法返回的是实体对象本身,而load方法返回是实体对象的cglib代理类
  • 采用get加载数据如果没有匹配的数据返回null ,而load方法抛ObjectNotFoundException(get方法取不到数据时返回的对象就是null,当时load时代理类要继承po(po是null)类,所以回报异常。
  • load方法一般不单独使用(因为load方法查出的对象,return过后就不能使用了)

17.懒加载机制:

  • 定义:只有在真正使用实体对象时,才发出Sql语句加载它。所谓真正使用实体对象时是指调用了对象的方法,其中不包括getId,getClass方法。
  • 优点:避免无谓的性能开销
  • 当使用load方法加载实体时,会看映射文件中配置该类的class标签上的lazy属性,lazy=true才实现懒加载
  • 当使用getXXX方法加载关联对象时,会看映射文件中配置该关联对象的标签上的lazy属性,然后再决定是否实现懒加载
  • Hibernate标签上的 lazy属性,在3.x后是默认打开的,在以前版本中默认是关闭的。
  • 懒加载生命周期与session有关,lazy加载必须依赖于session一直开启,session关闭懒加载就失效,抛LazyInitializationException
  • 懒加载是用cglib代理类实现的,它依赖cglib.jar。cglib代理类是实体类的子类,cglib代理类能发送sql语句

18.懒加载的配置:

  • <class> 标签

     取值:true/false

     只对普通属性的延迟加载有效,不包括集合和其他类属性。

  • <set><List>集合标签

    取值: true/false/extra

    如果设置为true,那么就会在该集合被加载时发出SQL语句

    如果设置为false,那么在发出查询普通属性sql时就会随后发出集合的查询语句。

    如果设置为extra,与设置为true类似,但相对智能,建议在实际工作中选用extra.

  • <one-to-one><many-to-one> 单端关联标签 

     取值: proxy /false/noproxy

     如果设置为proxy,那么就会在类对象被加载时发出SQL语句。

     如果设置为false,那么在发出查询普通属性sql时就会随后发出类对象的查询语句。

19.po对象的三个状态:

 1)瞬时态 transient状态的特征

 * 在数据库中没有与之匹配的数据(没有唯一标识符)

 * 没有纳入session的管理

 2)持久态 persistent状态的特征

* persistent状态的对象在数据库中有与之匹配的数据(有唯一标识符)

* 纳入了session的管理

* 在清理缓存(脏数据检查)的时候,会和数据库同步

3)托管态 detached状态的特征

* 在数据库中有与之匹配的数据(有唯一标识符)

* 没有纳入session的管理

状态说明例子:



 注意:这个例子中第一个try的里面的第一个红框的下面的的update语句是可以去掉的,因为持久态会清理缓存同步 数据,所以在commit的时候会发送update语句,下面的那个update语句是不可以去掉的因为po只有在持久态是才有那个特征。

po对象生命周期图:



 20.动态更新(load方法的用处,load方法不能单独使用)

     1)把将要修改表对象的.hbm.xml文件中class标签中添加一个dynamic-update=“true”的属性。

     2)将需更新的对象load进来。

     3)改变某个属性

     4) commit。



 

 

 

   

 

 

猜你喜欢

转载自1025358610.iteye.com/blog/2017613