posts - 195, comments - 34, trackbacks - 0, articles - 1

zz: Hibernate总结

Posted on 2007-08-12 10:25 小强摩羯座 阅读(265) 评论(0)  编辑  收藏

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 

SessionHibernate运作的中心,对象的生命周期、事务的管理、数据库的存取都与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中自带IDgenerator的含义:

1identity:用于MySql数据库。特点:递增

 <id name="id" column="id">

    <generator class="identity"/>

 </id>

  注:对于MySql数据库使用递增序列时需要在建表时对主键指定为auto_increment属性。

 

2sequence:用于Oracle数据库

 <id name="id" column="id">

   <generator class="sequence">

     <param name="sequence">序列名</param>

   </generator>

 </id>

 

3native:跨数据库时使用,由底层方言产生。

 Default.sequencehibernate_sequence

 <id name="id" column="id">

   <generator class="native"/>

 </id>

  注:使用nativeHibernate默认会去查找Oracle中的hibernate_sequence序列。

  如果Oracle中没有该序列,连Oracle数据库时会报错。

 

4hilo:通过高低位合成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>

 

5sequencehilo:同过高低位合成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>

6assigned:用户自定义id;

<id name="id" column="id">

<generator class="assigned"/>

</id>

 

7foreign:用于一对一关系共享主健时,两id值一样。

 

四、Hibernate类关系的处理:

1OnetoOne关系在数据库中如何体现,在JavaBean中如何体现,在Hibernate中如何映射onetoone关系。           

1、数据库中:一个表的外健对应另一个表的主健,外健要加上Unique约束。或者是两个表共享一个主健。

2javaBean中:在JavaBean中增加一个属性,即另外一个对象的引用,可以单向也可以双向。

3、在hibernate中:

主健映射:都是onetoone要用foreign生成策略。

外健映射:主表中用onetoone,副表通过propertyref  manytoone

 

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);

One-to-One PK主键映射  (详见代码)

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);

 

 

 

 

 

 

 

 

 

 

 

 

 

 


2ManytoOne关系在数据库中如何体现,在JavaBean中如何体现,在

Hibernate中如何映射manytoon关系。

1、数据库中:一个表的主健对应另一个表的外健。

2javaBean中:一个对象包含另一个对象的一个引用,另一个对象包含这个对象的一组(集合,用set)引用。

3、在hibernate中:用set.key指定具体列。

   Set一端一定要写inverse=“true”表示忽略集合一端的变化。

 

Order类和Item 的一对多关系为例子(详见代码):

 

     Item

 

-id: Integer

-product: String

-amount: int

-order: Order

 

 

-

-

 

     Order

 

-id: Integer

-owner: String

-phone: String

-address: String

-items: Set<Item>

  1        *

 

 

 

 

 

 

 

 

 

 

 


小结: 对象的关联关系有一对一、一对多、多对一和多对多,其中多对一和一对多关系比较常见。

一对一关系有两中方式:以主键关联和以外键关联。 

一对多和多对一通常应设置为双向关联,并在“一”这一方设置inverse="true"(比如一个班级对应多个学生,在班级这一边设置inverse="true")。设置了inverse="true"这一端比较清闲,它把控制权交给了另一端。让“多”这一端有控制权。   

多对多 可以借助中间表来保存两个实体之间的关系。

 

 


对象在Hibernate中的状态图:

   对象3种状态: Transient(瞬时)   Persistent(持久Detached(托管)

 

临时状态

new

 


garbege

get()

load()

find()

iterate()

etc.

                                                                                   

持久化状态

save()

saveOrUpdate()

 

evict()

close()*

clear()*

update()

saveOrUpdate

lock()

delete()

游离状态

 

garbege

 

v


只有注册用户登录后才能发表评论。


网站导航: