Hibernate中文版是一个开放源代码的对象关系映射框架,界面简洁明晰、操作方便快捷,对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate中文版可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。
相关软件 | 版本说明 | 下载地址 |
---|---|---|
猿编程客户端 | 官方版 | 查看 |
Sublime Text | 中文版 | 查看 |
JD-GUI | 中文版 | 查看 |
vc++6.0 | 简体中文企业版 | 查看 |
基本简介
Hibernate中文版的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。
数据库设计
a) 降低关联的复杂性
b) 尽量不使用联合主键
c) ID的生成机制,不同的数据库所提供的机制并不完全一样
d) 适当的冗余数据,不过分追求高范式
工作原理
Hibernate工作原理是Configuration读取Hibernate的配置文件bai和映射文件中的信息,即加载配置文件和映射文件,并通过Hibernate配置文件生成一个多线程的SessionFactory对象。
然后,多线程SessionFactory对象生成一个线程Session 对象;Session对象生成Query对象或者Transaction对象;可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate( )等方法对PO进行加载、保存、更新、删除等操作。
在查询的情况下,可通过Session 对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作结果到数据库中。
缓存机制
一级缓存:hibernate的一级缓存是由session提供的,因此它只存在session的生命周期中。也就是说session关闭的时候该
session所管理的一级缓存也随之被清除。hibernate的一级缓存是session所内置的,默认开启,不能被卸载,也不能进行任何配置。在缓
存中的对象,具有持久性,session对象负责管理.一级缓存的优点是使用同一个session对象多次查询同一个数据对象,仅对数据库查询一次。一级
缓存采用的是Key-Value的MAP方式来实现的。在缓存实体对象时,对象的主关键字ID是MAP的Key,实体对象就是对象的值。所以说一级缓存是
以实体对象为单位进行存储的。访问的时候使用的是主键关键字ID。一级缓存使用的是自动维护的功能。但可以通过session提供的手动方法对一级缓存的
管理进行手动干预。evict()方法用于将某个对象从session的一级缓存中清除。clear()方法用于将session缓存中的方法全部清除。
使用说明
1.Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
2.SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
3.Configuration类负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。
4.Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务5.Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语句或SQL语句两种表达方式。
常见问题
NHibernate是否会修改我的IL?如果没有,如何知道发生了什么变化?
不,无论如何它不会修改您的IL。您的IL仍然与编译时的IL完全一样。
NHibernate加载对象时,ISession会保留对象状态的快照。当您Flush()时,ISession NHibernate会将快照与对象的当前状态进行比较。适当的更改将写入数据库。
如何将NHibernate集合转换为.NET集合?
集合映射的名称是显示Java和.NET之间差异的明显位置。Java的集合库比System.Collection拥有更多的选择。
所述<列表>直接映射到一个IList。
所述<地图>直接映射到一个IDictionary。
所述<袋>映射到一个IList中。甲<袋>不完全与符合的IList接口,因为添加()方法不能保证返回正确的索引。可以在不初始化IList的情况下将对象添加到中。确保对您的API使用者隐藏IList或对其进行详细记录。
所述映射到一个Iesi.Collections.ISet。该接口是随NHibernate一起分发的Iesi.Collections程序集的一部分。
如果将order-by属性添加到集合映射元素,则具体的集合类型将更改为支持维持元素添加顺序的一种。对于,它仍然使用ArrayList。对于具有order-by属性的和,具体的集合类分别更改为Specialized.ListDictionary和Iesi.Collections.ListSet。这应该不是问题,因为您的API使用者正在使用IList和Iesi.Collections.ISet接口。
如果将排序属性添加到集合映射元素,则具体的集合类型将更改为支持排序的类型。对于具有sort属性的和,具体的集合类分别更改为SortedList或Iesi.Collections.SortedSet,它们使用sort属性中提供的IComparer。对于API使用者,这应该不是问题,因为他们正在使用接口IList和Iesi.Collections.ISet。
随着集合大小的增长,使用order-by或sort属性确实会影响地图和集合的性能。
什么是持久性收集?
在NHibernate中使用此术语来指代其内部类的集合(NHibernate.Collections.Set,List,Bag等),该类包装了用户的集合。属于NHibernate返回的实体的所有集合都是持久性的(=包装)。作为保存过程的一部分,传递给“保存”的实体也将其集合包装并由包装器替换。持久性集合具有其原始状态的快照,因此可以更有效地进行更新。
包含查询结果的集合不是持久性的,它们是普通的.NET集合(= ArrayList = s)。