Hibernate 总结
一、 基础知识
① Hibernate是对象/关系映射(Object/Relation Mapping)的解决方案。
② Hibernate架构
● POJO类
● hibernate.cfg.xml
● *.hbm.xml
● Hibernate应用
二、 几个重要的类
● Configuration类 (负责管理Hibernate的配置信息)
当创建SessionFactory时,Configuration实例可以指定使用哪一个映射文挡。应用程序通常只是创建一个Configuration实例,并通过它创建一个SessionFactory实例。
● SessionFactory类 (负责创建Session实例)
它是线程安全的,可以被多线程调用以取得Session,而且构造SessionFactory很消耗资源,所以多数情况下一个应用中只初始化一个SessionFactory,为不同的线程提供Session。
● Session类
Session是Hibernate运作的中心,对象的生命周期、事务的管理、数据库的存取都与Session息息相关。Session不是线程安全的,多个执行线程共享一个Session,将会发生数据共享而发生混乱问题。为了解决此问题,可以采用ThreadLocal变量,使用它可以有效隔离执行所使用的数据,也就避开了Session的多线程之间的数据共享问题。
如何调用hibernate API?
1、创建Configuration对象。(解析配置文件)
Configuration config = new Configuration();
2、通过Configuration创建Session Factory(线程安全的重量级组件)。
Config = config.configure(); //configure()方法会在CLASSPATH下寻找hibernate.cfg.xml
SessionFactory = config.buildSessionFactory();
3、通过SessionFactory创建Session会话对象。
Session session = sessionFactory.openSession();
4、通过Session取得事务对象。
Transaction trans = session.beginTransaction();
5、通过session与数据库进行会话。
session.save(object o); //增
session.delete(object o); //删
session.update(object o); //改
session.get (Class clazz, Serializable id); //根据Id查找对象
session.createQuery(String sql); //自己拼HQL语言查找对象返回一个Query对象。
6、提交操作,结束事务。
Trans.commit();
7、关闭Session
session.close();
注:第一步和第二步一般放在静态初始化代码块中执行。
三、Hibernate中自带ID的generator的含义:
1、identity:用于MySql数据库。特点:递增
<id name="id" column="id">
<generator class="identity"/>
</id>
注:对于MySql数据库使用递增序列时需要在建表时对主键指定为auto_increment属性。
2、sequence:用于Oracle数据库
<id name="id" column="id">
<generator class="sequence">
<param name="sequence">序列名</param>
</generator>
</id>
3、native:跨数据库时使用,由底层方言产生。
Default.sequence为hibernate_sequence
<id name="id" column="id">
<generator class="native"/>
</id>
注:使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。
如果Oracle中没有该序列,连Oracle数据库时会报错。
4、hilo:通过高低位合成id,先建表hi_value,再建列next_value。必须要
有初始值。
<id name="id" column="id">
<generator class="hilo">
<param name="table">high_val</param>
<param name="column">nextval</param>
<param name="max_lo">5</param>
</generator>
</id>
5、sequencehilo:同过高低位合成id,建一个sequence序列,不用建表。
<id name="id" column="id">
<generator class="hilo">
<param name="sequence">high_val_seq</param>
<param name="max_lo">5</param>
</generator>
</id>
6、assigned:用户自定义id;
<id name="id" column="id">
<generator class="assigned"/>
</id>
7、foreign:用于一对一关系共享主健时,两id值一样。
四、Hibernate类关系的处理:
1、One―to―One关系在数据库中如何体现,在JavaBean中如何体现,在Hibernate中如何映射one-to-one关系。
1、数据库中:一个表的外健对应另一个表的主健,外健要加上Unique约束。或者是两个表共享一个主健。
2、javaBean中:在JavaBean中增加一个属性,即另外一个对象的引用,可以单向也可以双向。
3、在hibernate中:
主健映射:都是one-to-one要用foreign生成策略。
外健映射:主表中用one-to-one,副表通过property-ref many-to-one
create table car_pk ( id number(10,0) not null, name varchar2(15), serial varchar2(30), manufacturer varchar2(50), producedate date, primary key (id) ); create table engine_pk ( id number(10,0) not null, model varchar2(20), manufacturer varchar2(50), producedate date, primary key (id) ); alter table engine_pk add constraint fk_engine_car_pk foreign key (id) references car_pk(id); |
Table car_pk
Id | name | serial | manufacturer | producedate |
|
|
|
|
|
Table engine_pk
Id | model | manufacturer | producedate |
|
|
|
特点:engine_pk 表的Id 与 car_pk表共享主键。
One-to-One FK外键映射 (详见代码)
Table car_pk
Id | name | serial | manufacturer | producedate |
|
|
|
|
|
Table engine_fk
Id | carid | model | manufacturer | producedate |
|
|
|
|
|
特点:engine_fk表多了carid外键字段来维护与car_fk 表的关系。
建表语句如下:
create table engine_fk (
id number(10,0) not null,
model varchar2(20) not null,
manufacturer varchar2(50) not null,
producedate date,
carid number(10,0) unique,
primary key (id)
);
alter table engine_fk
add constraint fk_engine_car_fk
foreign key (carid)
references car_fk(id);