刚刚学完Hibernate,整理了下,共享出来,欢迎指点!
学习最好从问题入手!
1、怎么理解Hibernate?
Hibernate是一个纯Object RelationMapping(ORM)框架,它基本支持所有对象模型与关系模型的转换。
而且它还支持,继承、级联等复杂模型的转换。
Hibernate是对象关系映射框架ORM框架,对JDBC进行了一次封装;提供了强大,高性能的对象到关系型数据库的持久化服务
2、Hibernate的优势?
Hibernate框架是一个开放源代码的对象关系映射框架
对JDBC进行了轻量级的对象封装
可以使用对象编程思维来操纵数据库
JTA是java Transaction API支持分布式事务及跨数据平台的数据
SessionFactory:属于单一数据库的编译过的映射文件的一个线程安全的,不可变的缓存快照。Session的工厂。
会话,Session:单线程,生命周期短期促的对象,代表应用程序和持久化层之间的一次对话。封装了一个JDBC连接。(线程不安全)
持久化对象(Persistent Object)及其集合(Collection):生命周期短促的单线程对象,包含了持久化状态和商业功能。普通的JavaBeans/POJOs(简单的Java对象Plain Ordinary java Object)
临时对象(Transient Object)及其集合(Collection):目前没有从属于一个Session的持久化类的实例。
事务,Transaction:(可选)单线程,生命周期短促的对象,应用程序用它来表示一批工作的原子操作。是底层的JDBC,JTA或者CORBA事务的抽象。
ConnectionProvider:(可选)JDBC连接的工厂和池。从底层的DataSource或者DriverManager抽象而来。
TransactionFactory:(可选)事务实例的工厂。
4、Hibernate的环境搭建?
jar包的配置,不同的环境不一样的jar包,具体怎么弄,我也说不上来
有思路清晰的大神可以共享下
Hibernate配置文件hibernate.cfg.xml。持久化对象与数据库表的映射文件。
文件命名最好遵循规范,便于阅读。
使用myeclipse搭建hibernate开发环境
创建数据库连接;新建一个项目并且转变成hibernate项目;选中需要反向工程的表,创建POJO与映射配置文件
5、锁机制
业务逻辑的实现,往往需要保证数据的安全性
Hibernate支持两种锁机制:即通常所说的“悲观锁(Pessimistic Locking)”和“乐观锁(OptimisticLocking)”。
悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,
即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。
乐观锁,大多是基于数据版本(Version)记录机制实 现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,
一般是通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,
将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于 数据库表当前版本号,则予以更新,否则认为是过期数据。
悲观锁与乐观锁的比较:
悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,
这样的开销往往无法承受;相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。乐观锁机制往往基于系统中的数据存储逻辑,因此也具备一定的局限性
锁机制我理解也不到位啊,大家可以讨论下,我也学习
6、实体对象的生命周期
实体对象:指Hibernate的O/R映射关系的域对象(即O/R中的O);
实体对象的生命周期:自由状态、持久状态、游离状态自由状态的两个特征—>不处于Session的缓存中,或不被任何一个Session;实例关联、在数据库中没有对应的记录。
持久状态的特征—>位于Session实例的缓存中,或持久化对象总被一个Session实例关联;
游离状态的特征—>关闭Session或清理缓存,不再位于Session的缓存中,或说游离状态的实体对象不被Session关联;
7、VO与PO
处于自由与游离状态的下的实体对象称为值对象(Value Object)
处于持久状态的实体称为创建对象(Persistent Object)
区别:VO相对独立的对象,处于非管理状态;PO对象处于持久状态,
PO的变化在事务提交时将反映到数据库中;如果PO与Session分离就会变成VO
8、Session接口
作用:提供了基本的保存、更新、删除和加载Java对象的方法
Session线程是不安全的,使用ThreadLocal模式解决
获得Session对象的两种方法:openSession和getCurrentSession之间的区别
getCurrentSession创建的Session会绑定到当前线程,而openSession不会
getCurrentSession创建的Session会在事务回滚和事务提交后自动关闭,而openSession创建的必须手动关闭(调用Session的close()方法)
9、 get ()与load()
相同点
&按照OID查询指定对象
&如果按照OID进行查询,推荐使用load()或get()实现,而不是使用HQL间接查询
区别
&记录不存在时处理方式不同。get()返回null,load()抛出HibernateException异常
&load()可以返回实体的代理类实例,get()永远都是返回实体类。或者说load()方法支持延迟加载,而get()总是立即加载。