标签:
Hibernate是什么?
Hibernate是一个轻量级的ORM框架
ORM--------Object Relational Mapping
ORM的基本对应规则:
1,类跟表相对应
2,类的属性和表的字段相对应
3,类的实例与表中的一条记录相对应
4,一个类可以对应多个表,一个表可以对应过个类
5,DB中的表可以没有主键,但是Object中必须设置主键字段(?)
6,DB中的表与表的关系,映射为Object之间的关系
7,Object中的属性的个数和名称和表中的字段的个数和名称可以不同
Hibernate中的核心类和接口一共6个:Session,SessionFactory,Transaction,Query,Criteria,Configuration
----------------------------------------------------------------------------------------------------------------------------------
Session:Session接口负责执行被持久化对象的CRUD(增加(Create)、读取(Retrieve)(重新得到数据)、更新(Update)和删除(Delete))操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
----------------------------------------------------------------------------------------------------------------------------------
SessionFactory:SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
----------------------------------------------------------------------------------------------------------------------------------
Transaction:Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
----------------------------------------------------------------------------------------------------------------------------------
Query:Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
----------------------------------------------------------------------------------------------------------------------------------
Criteria:Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
----------------------------------------------------------------------------------------------------------------------------------
Configuration:Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。
如何在MyEclipse中使用Hibernate:
在MyEclipse6.0之后已经可以直接通过集成开发IDE来很方便的使用Hibernate。
一:首先将数据库与MyEclipse连接起来:
在视图切换的图标(Open Perspective)单击左键,打开MyEclipse DataBase Explorer ,在文件浏览区(DB Browser)空白区单击右键,选择new
,选择你的数据库的连接方式,给你的驱动起个名字,填写URL,USER name,user password,添加数据库驱动的jar包,在保存密码之前打个对勾,
点击next,这个是数据库的隔离方式,默认的是都能看到,可以自己选择需要显示的模式。之后就结束了。
二:MyEclipse中对需要使用Hibernate的项目添加jar包。
对项目右键,选择MyEclipse,选择Add Hibernate Capabilites...,选择需要使用的Hibernate版本,选择需要连接的数据库(第一步如果配置正确,在这里就可以看到自己配置的数据库连接了) ,选择要连接的数据库,空白处就会自动填充,直接next,
显示的是配置hibernate.cfg.xml文件的位置,默认的是在src根目录下,直接点next,会创建一个工具类HibernateSessionFactory,填写需要在哪个包下创建这个类
指定后finish。
三:对配置文件稍加修改(非必须,只是在开发过程中能是Hibernate更加透明一点)
这一步不是必须要做的,在hibernate.cfg.xml文件的session-factory的节点下 添加两个新的节点
<property name="show_sql">true</property> <!-- 这个属性配置显示sql语句-->
<property name="format_sql">true</property> <!--这个属性配置使显示的sql语句格式化 -->
四:创建好存放实体类的包文件,将数据库中的表反向映射成java类(重点)
打开MyEclipse中Hibernate的视图,找到要反向映射的表,右键点击,选择Hibernate Reverse Engineering,选择项目,找到要存放实体类的包下
,选择自动生成配置文件,自动生成pojo之类的,点next,如果有多对多的关系,涉及到中间表,选择many to many 点击next
最后finish.
五:如果需要,修改主键生成策略,
在生成的的实体类的配置文件中,id节点下有个<generator class="assigned" />节点,将assigned改成increment
注:
关于Hibernate中已经定义好的主键生成策略:
大致分为两大类,自然主键,业务主键。
代理主键:
1,increment,其机制就是从表中取最大值(Max函数)再加一,要求主键必须是数字(可以做加1操作的整数)。
2,identity,由底层数据库生成OID,条件是数据库支持自增长的字段。
3,sequence,根据底层数据库中的序列生成OID条件是底层数据库支持
4,hilo,高低算法,根据其特定表中的字段作为其中的一个值。
5,seqhilo(3.0后出现),不需要特定表中的字段,需要指定序列
6,native,根据数据库的情况自动选定OID的生成方式(identity,sequence,hilo)。
注意:native的生成策略,在oracle数据库中由于没有自增长类型,所以他会调用一个序列,要去找个序列的
名称必须叫: hibernate_sequence
7,uuid.hex,采用uuid128位的算法生成OID,其表现形式为16进制的字符,所以是个32位的字符串。
自然主键:
1,assigned,参与到业务操作中的主键,如用户名,这个主键需要用户自己指定
还有用户自定义主键:需要实现接口IdentityFireGenerator
Hibernate对java的类型的映射:
type: java类型 标准sql oracle
int/integer int/integer integer 4字节
long long/Long BIGINT 8字节
short short/Short SMALLINT 2字节
byte byte/Byte TINYINT 1字节
string string varchar 变长字符
boolean boolean bit
Data date(util/sql) DATE
binary bite[] varbinary blob
text string clob clob
blob java.sql.blob blob blob
多表关联反向时:
一,手动配置.
一对多或者多对一:
example:从orders到users的多对一的关系,相应的我们可以说users到orders是一对多的关系
在一方的实体类中,应该有个set集合来存放多方的对象,在多方应该有个一方的对象引用。
在一方的配置文件中,对set集合做配置,
<set name="set对象的名字"> <key> <column name="列名" /> <!-- 这个列名就是参考的另外一个表的列名 --> </key> <one-to-many class="多方的类全名"/> </set>
在多方时,需要对一方的对象做配置:
<many-to-one name="一方的对象引用名字" class="类全名"> <column name="列名" /> <!-- 这个列名就是外键 --> </many-to-one>
多对多:
在数据库中,因为表是二维的一个关系,所以多对多的表现形式是通过中间表,那么是否生成中间表呢?
这个需要看这个中间表中是否还存有其它的数据,如果没有其它的数据单纯只是表现两个表的多对多的关系,那么可以这样配置:
在连个实体类中都有对方表的一个set集合来存放对方的对象。
在配置文件中,都有如下的节点:
<set> <key> <column name="自己的列名"/> </key> <many-to-many entity-name="这个set集合中存放的对象的类全名"> <column name="对方的列名"/> </many-to-many> </set>
如果中间表中有数据,那么中间表与另外两张表都是一对多的关系,
则在两张表中各有一个存放中间表实体类的set集合,中间表实体类中各有一个两个表的实体类的对象的引用。
配置文件则是三个实体类之间的多对一的关系
在Hibernate中,为我们提供了对象导航式查询,这什么意思呢?就是说,如果在配置文件中为两者配置关联关系了,那么
在查询时可以将与之关联的对象一并查出来。
注意:延迟加载。
在Hibernate2.x版本中,默认的查询关联对象的策略是立即加载。
在Hibernate3.x版本中,默认的查询关联对象的策略是延迟加载。
如果使用延迟加载,那么一定要注意Session的生命周期,如果在第一次查询中将Session关闭了,那么延迟加载将无法发起查询,
就会发出一个异常。
如何将延迟加载改为立即加载呢?
有三个办法:
1,修改映射配置文件中,在关联对象的配置节点,将lazy属性改为false。
2,通过Hibernate的工具类中的方法来完成立即加载:
Hibernate.initialize(要被立即加载的对象)
3,可以通过访问这个对象来是指立即加载(如果是个set,可以遍历,如果是个对象,可以访问这个对象的一个任意(可访问的)方法)。
标签:
原文地址:http://www.cnblogs.com/hjs-joker/p/4934502.html