初触hibernate--基础知识盲区

1.       三种状态的理解:

Transient: new 的对象仅仅在内存中,没有在session的缓存

Persistent: new 的对象不仅仅在内存中,还在session的缓存以及DB中(硬盘);

detached : new 的对象仅仅在内存中 和 DB 中,但是session的缓存却没有.

2.       get:一旦执行就立马生成sql语句去DB中取数据。

load:不会立马生成sql语句去数据,而是先返回一个代理对象(其实是具体对象的子类,但是一定是覆盖了父类的方法,这可以推理的),等需要去对象中的内容时,在生成sql语句去数据。因此在取对象中的内容之前,即使DB中没有对应的记录,它还不会报错,因为sql语句没有发送,但是一旦去代理对象的内容时,就会发出sql语句,于是立马报错!(load的和get的区别还有:各自在生成sql取不存在的数据时,前者报错,后者不会而返回null)。

注意:getload之前都会在缓存中寻找是否已经存在了对应的对象,如果有的话,就都不会再发送sql语句去DB中取。

3.       updatedelete会在commit时才发送sql语句。save()会即时发送sql语句。

delete()后,session缓存中将会去掉对应的对象,但是此时还没有commit,所以DB中还存在着对应的记录,因为sql语句还没有发送。即对象将会从persist转化为detached态。然而,此时

4.       持久态中的对象的属性的每一个变化都会通过sql语句(update)同步到DB中,但是如果所有修改过的属性的值和改变前的一样(hibernate会对比的),就不会updateDB中;如果(有一个属性)不同话,都会update,而且是所有字段都给按照对象的对应属性现在值update掉(就是不可以修改部分字段)。

5.       session.update(Object):用起来非常死板,不可以修改部分字段,因此还是HQL好点。

还有,update()一次只能更新一条记录,而且如果在表中找不到要更新的row的话,就会报错!(限制非常多)。

6.       注意使用session.update()的话,生成的update语句是在commit()中发出去的,因此无论在commit前修改多少次,都只会发出一次update语句来更新最后一次修改的值。都

如果想在commit()前每次都发送一次update语句的话,就在两次修改间使用session.flush()(强制发送update语句)。

7.       如果只想update部分字段,有三种方法:

l  在property中 加入:updatable=false,表示这个字段是无法改变的,当然这是最笨的方法。

l  在class中 加入:dymatic-update=true,表示可以动态更新,就是可以更新部分字段,但是这种方式只可以在同一个session中(可以对比而决定是否修改),却无法跨session—因为当一个session close后,它就转化成为detached,当再要通过它更新的话,就得在创建一个session,此时,又会变成更新所有字段的形式,因为新的session中没有缓存这个对象,所以无法对比,所以还是全部字段update。但是有一种方式可以避免这种情况,就是在新的session中使用merge(obj),就是将记录和对象进行合并,就是将记录中和对象中属性的值不同的改为和对象的相同。然而,这合并前肯定有一个对比的过程,于是session还得将对应的记录从DBselect出来然后再对比,这样的话,就会多了一次查询。

l  使用HQL吧,这是最好的。

8.       session.save()虽然将对象从transient转化成persistent状态,但是并非其全部的属性(例如如果部分属性是save前没有设置值的)都变得和DB中对应字段的值一致。

9.       每一次commit时,都会检查此时需要udate的对象和刚get出来的对象的属性上的不同,如果有不一致的属性,就会发出update sql语句;如果没有改变(即使过程中改变了很多次但是改到此时的属性值依然和刚get出来的值一致),就不会发送update语句。

10.    采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession(),创建的session必须手动关闭

11.    openSession():每次生成一个新的session对象,

getCurrentSession():从上下文中找,提高复用率。

12.    ID生成策略:常用的有:native(任意平台),uuid(任意平台),identity(主要mysql,对应auto_increment),sequence(oracle).

13.    建立联合主键,

14.    cascade该属性定义类和类之间的级联关系。定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作,而且这种关系是递归调用的。举个例子:Order 和OrderItem有级联关系,那么删除Order时将同时删除它所对应的OrderItem对象。而如果OrderItem还和其他的对象之间有级联关系,那么这样的操作会一直递归执行下去。

15.    项目中Hibernate 介于程序和数据库之间,会极大地减轻数据库的负担:由于hibernate的缓存和事务管理,程序很多sql语句没必要每一次都传输到DBMS中执行,这样的话在高并发情况下,很多针对相同数据记录的dml可以在hibernate的缓存中完成,然后再适当时刻hibernate只需将最终的修改映射到数据库中。当然这样就会增添了程序的负担。

16.    由于hibrenate的多态查询的特点,所以PO之间千万别存在继承关系。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29900383/viewspace-1461660/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29900383/viewspace-1461660/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值