传智播客-hibernate(1)-hibernate入门

hibernate(v3.3.1)是早一阵子学的,历史比较久远了,所以这篇文只能说是我笔记(还好本人是笔记狂,好记性不如烂笔头)上hibernate的知识要点和徐培成老师讲课中提到的一些实际应用中的小技巧和注意事项的摘取和整理(美其名曰“总结”)。

 

开卷语:
1、学习一个框架,看源码不如看doc文档,源码只是实现,doc是思想(ms很多人说过,学习一个框架重在学习它的思想,就是这个“思想”二字深奥。。我的感觉是,这个东西学起来不难,用起来不难,但是要用得游刃有余很难(多练多看也许某天能达到),能自己设计一个这样的框架更是难上加难(除了多练多看还得多想还不一定能达到这个境界)。。反正本人在可以预见的很漫长的一段时间内是不会具备这个能耐滴T_T)。
2、hibernate是一项数据持久化技术,封装了数据的访问细节,所以说体现了OO思想。
3、hibernate应用属于数据持久化层,而数据持久化层是从业务逻辑层分离出来的,为业务逻辑层提供面向对象的api。
4、完善的持久化层应该至少具备以下几点(下面是老师总结的,不过《深入浅出Hibernate》第一章也有提到,推荐一下,这是一本好书,虽然是2005年的):
(1)代码复用性高,可完成所有数据访问操作;
(2)如果有需要,能够支持多种数据库平台,而且更换数据库平台时,代码无需更改(参见上一条);
(3)具有相对独立性,当持久化层更换时(例如将hibernate换成toplink,这里体现了接口编程的好处),不会影响上层实现。
5、hibernate是和标准sql打交道的,但只是对jdbc做了轻量级封装,即只封装了jdbc的部分api,例如存储过程就没有做封装。
6、hibernate也被称为orm工具,“映射”是其思想要点,主要是由反射调用实现的--这个是指底层,而表现形式在我看来可能就是注解及配置文件。关于hibernate注解的具体使用,可以参见doc文档~

 

杂记:
1、sessionFactory,session,事务,CURD操作是hibernate的基本应用,相应的还有Query和Criteria查询接口。
(1)sessionFactory相当于数据库的连接池。
(2)session中有缓存,即一级缓存,保存了当前工作单元的加载对象;hibernate的CURD操作的sql语句都是预先在sessionFactory的session缓存里生成的;映射元数据也是。二级缓存靠缓存插件实现的,一般由第三方提供。
(3)session自有的CURD方法只是执行了简单的hql语句,如果业务逻辑较为复杂,应该使用Query和Criteria;而Criteria接口完全封装了基于字符串形式的查询语句,比query接口更面向对象,擅长执行动态查询。
(4)使用hibernate的时候,要注意看它生成的sql语句,而且要牢记一点,一条sql的执行就是一项开销,所以尽可能的减少sql对数据库的操作是提高应用程序性能的方法之一。

 

2、hibernate访问持久化类属性的策略:属性访问和方法访问。
hibernate里方法访问优先级高于属性访问。如果两种访问方式同时设置,则属性访问无效。一般情况下这两者的使用没有不同,但是当一个持久化类的多个属性合成表中的一个字段的时候,就只能使用后者了(例如customers表里的字段name,是由持久化类Customer的两个属性fName和lName组合而成)。

 

3、关于id:
(1)持久化类的id属性: hibernate里的主键映射的其实是持久化类的OID(对象标识符)(数据库根据主键区分表里的记录/java根据内存地址区分对象)。
(2)id生成策略:increment|identity|sequence|native|hilo|uuid(32)(这些注释/元素的属性的具体含义可以参见相关文档)适用于代理主键;assign适用于单个自然主键(指将具有业务含义的字段设置为主键);和id元素同级的元素<componsite-id>则可以定义多个业务字段合成的自然主键;注解的话则有三种方式:@Id和@Embeddedable/@EmbeddedId/@IdClass,但是所依赖的类必须实现serializable接口以及实现equals()/hashcode()方法(详情请参见官方文档hibernate_annotations.pdf的2.2.6映射复合主键与外键)。
(3)UUID包含:IP地址,JVM的启动时间(精确到1/4秒),系统时间和一个计数器值(在JVM中唯一)。 在Java代码中不可能获得MAC地址或者内存地址,所以这已经是我们在不使用JNI的前提下的能做的最好实现了。(摘自hibernate_reference.pdf满江红译本-->5.1.4.3UUID算法)

 

4、关于Basic注解:
所有没有定义注解的属性等价于在其上面添加了Basic注解;可以通过Basic注解的fetch属性声明持久化类的属性的获取策略,但是一般情况下这么做没有意义,因为要使其生效,需要对字节码文件(class文件)增强处理(例如在原class文件中添加一些方法,动态生成类也是采用的这种机制);optionall属性是jpa产品相关的,在hibernate里等价于nullable属性。

 

5、关于update:
session的update方法是将游离对象转变为持久化对象,不论对象属性内容是否发生改变,都会执行sql的update操作。如果希望仅属性变化时才update可以将class元素的select-before-update属性设为true(使用时要注意分析业务逻辑,如果事务update操作倾向明显,就不要加,否则性能上会适得其反);此外要注意与触发器的协同(触发器会导致缓存与数据库不一致,解决办法是执行完操作后,立即调用session的flush和refresh方法,迫使缓存与数据库同步)。
总结:数据update时要注意两点:
(1)不要盲目更新(使用select-before-update);
(2)不要随意激活触发器(慎用select-before-update)。


(待续。。。)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值