Hibernate学习心得

来源:互联网 发布:2016全球社交网络排行 编辑:程序博客网 时间:2024/05/21 14:45

                  一、 Hibernate是一款ORM框架即使对象关系型映射 object-relative  mapping,使用hibernate的步骤1、配置hibernate.cfg.xml,这个配置文件包含了基本的配置信息如,数据库驱动,数据库连接名,数据库用户名以及密码,连接池大写,是否显示sql 以及对象和数据库的映射文件 xx.hbm.xml等文件,更多配置还得看官方文档。2、写实体类。3、配置数据库和实体类映射文件xx.hbm.xml。。。对了记得要导入hibernate相关jar包,jar包最好是相同版本的,不同的版本网上东一个西一个凑起来可能会发生无法预知的错误。 在java中使用hibernate的具体操作是 先获得初始化对象Configuration对象(即加载hibernate.cfg.xml,这个配置文件默认是放在src下面,如果你更改了文件路径,那么你在获得configuration的时候,需要填入相应的路径。情况1:在src下面的时候直接写 Configuration cf = new Configuration().configure(); 情况2:假如hibernate.cfg.xml放到某个路径的时候 要获得configuration就得这样写Configuration cf = new Configuration().configure(“xxx/hibernate.cfg.xml”)  ),然后通过cfg获得sessionFactory(SessionFactiory sf = cfg.buildSessionFactory()),然后再通过sessionFactory获得session,然后session开始事务处理(session.beginTransation()),然后进行具体的save,update,load,delete等等操作,然后提交事务session.commit(),最后关闭session。。。 hibernate中的事务默认是关闭的,所以需要宣示开启,假如没有开启事务  提交事务,hibernate中相关的操作是不会提交到数据库的,而jdbc中事务是默认开启的。


         二、hibernate与jdbc有什么相同点和不同点

    相同点:1、 jdbc和hibernate都是操作数据库的中间件,2、两者对于数据库进行直接操作的对象都不是线程安全的都需要及时关闭,3、两者都可以对数据库的更新操作进行显式的事务处理

不同点:1、jdbc使用的sql,而hibernate是使用它自己的语言hql, hibernate操作的是对象(操作对象省去了繁琐的参数set get操作)而jdbc操作的是数据,2、jdbc操作的对象都是“瞬时状态”,无法与数据库中的值实时保持一致。3、而hibernate操作的对象是持久化对象,可以跟数据库中的数据保持一致;关于第3点我们可以看看下面的代码将会更加直观:

Configuration cfg = new Configuration().configure("entity/hibernate.cfg.xml"); 
SessionFactory sf  =cfg.buildSessionFactory();
Session sess = sf.openSession();
Transaction tx = sess.beginTransaction();
User user = new  User();
user.setUsername("李");
user.setPassword("123456");
user.setRoleId(3);
sess.save(user);//user通过session save已经变成持久化对象,
        user =(User)sess.load(User.class, 1);//我们再从数据库中拿出来它还是持久化对象
user.setPassword("9eed");//这里我们将密码set成9eed
tx.commit();//提交事务,虽然我们没有使用update,但是数据库中的password数据已经从123456变成9eed了(当事务提交的

  时候清空了缓存)
sess.close();


    三、hibernate 中对象的三种状态 

在Hibernate中,对象有三种状态:临时状态、持久状态和游离状态。

也叫:瞬时态(Transient)、持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。

      

  1、自由状态/瞬时状态,这个比较好理解就是我们在java中new出来的一个新的对象如new User(),此时这个对象是新建的在数据库中没有相应的数据,没有在hibernate缓存中,这样的对象就是自由状态。自由状态对象可以通过save,update转变成持久状态对象,当持久状态的对象通过session.delete(obj),在清理缓存之后(commit),会将这个持久对象的在数据库中对应的数据删除,同时这个持久对象将变成自由状态

2、持久状态,简单的说就是被hibernate中的session管理(save, update,saveorupdate等等),持久化对象都必须与制定的Hibernate Session关联,被持久化的对象在数据库中有相应的数据,持久化对象的属性值可以跟数据中的值保持一致如上面的例子。(通过上面的例子我们可以知道对于持久状态的对象,我们可以不用update在缓存flush(commit)的时候会自动更新到数据库中,update主要是用于瞬时状态对象和脱管状态的对象)

3、游离状态、脱管状态,游离状态对象即持久化对象脱离session管理之后的对象即对象不在持久化管理范围之内,当session close,clear,evict(obj)(将指定对象从缓存中清除),flush,当前对象就会从持久状态变成游离状态,游离状态通过session 的update方法又能转变成持久状态,


 脱管对象具有如下特点: 
       1. 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收; 
       2.   比瞬时对象多了一个数据库记录标识值。


Hibernate 配置文件fetch与延迟加载的关系:

fetch="join",已经指明了使用外连接查询,那么lazy的值就没什么用了,2端的数据都会查询出来,延迟不起作用 给你举一下fetch和lazy结合使用的情况。1、当lazy="true" fetch = "select" 的时候 , 这个时候是使用了延迟策略,开始只查询出一端实体,多端的不会查询,只有当用到的时候才会发出sql语句去查询 ; 2、当lazy="false" fetch = "select" 的时候 , 这个时候是使没有用延迟策略,同时查询出一端和多端,同时产生1+n条sql. 3、当lazy="true"/lazy="false" fetch = "join"的时候,这个时候延迟已经没有什么用了,因为采用的是外连接查询,同时把一端和多端都查询出来了,延迟没有起作用。
/* * 抓取策略 *         例子:在加载class的时候怎么样去加载student *         应用范围:在加载一端对象的时候,去加载多的一端对象的时候的方式 *      抓取策略和延迟加载----->研究对象是集合,这一点应该不难理解,懒加载是在一对多/多对多关联中,从的一方拿数据是否延迟加载多的那方。 抓取策略则是操作者本身已经明确了需要获取哪些数据,并且是在关联关系简单生成的SQL语句却很多,针对的也是一对多/多对多的关系 *         lazy         fetch *         false         select   有作用 *         true          join       延迟加载失效 *         false        subselect  有作用 *  *         总结:当fetch为join时,延迟加载失去作用 *              当fetch为select时或者为subselect时,延迟加载能控制sql语句的发出时间 *       */




 最后需要注意的是 在hibernate.cfg.xml文件中包含 mapping文件的时候需要注意路径问题 <mapping resource="entity/user.hbm.xml" />,这里entity/这个斜杠不要想当然的写成.     ,这是新手很容易犯的错



0 0
原创粉丝点击