<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    zz: Hibernate總結

    Posted on 2007-08-12 10:25 小強摩羯座 閱讀(266) 評論(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的含義:

    1、identity:用于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>

     

    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、OnetoOne關系在數據庫中如何體現,在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);

     

     

     

     

     

     

     

     

     

     

     

     

     

     


    2、ManytoOne關系在數據庫中如何體現,在JavaBean中如何體現,在

    Hibernate中如何映射manytoon關系。

    1、數據庫中:一個表的主健對應另一個表的外健。

    2、javaBean中:一個對象包含另一個對象的一個引用,另一個對象包含這個對象的一組(集合,用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


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 无码A级毛片免费视频内谢| 一级特黄a大片免费| 免费女人高潮流视频在线观看| 亚洲精品乱码久久久久久不卡| 国产成人亚洲精品播放器下载| 暖暖免费高清日本一区二区三区| 亚洲精品国产第一综合99久久| 国产色爽女小说免费看| 黄色一级视频免费| 亚洲一区无码精品色| 成人一区二区免费视频| 亚洲人成在线播放网站| 日韩免费的视频在线观看香蕉| 久久精品九九亚洲精品| 一区二区无码免费视频网站| 亚洲综合激情五月丁香六月| 国产乱子影视频上线免费观看| 狠狠热精品免费观看| 伊人久久亚洲综合| 小草在线看片免费人成视久网| 亚洲福利视频一区| 成年大片免费视频| 免费无码专区毛片高潮喷水| 亚洲老妈激情一区二区三区| 最近免费中文在线视频| 亚洲人成无码网站在线观看| 亚洲裸男gv网站| 日韩在线永久免费播放| 亚洲精品国产suv一区88| 亚洲欧洲无码AV电影在线观看 | 亚洲精品成人图区| 精品香蕉在线观看免费| 亚洲av日韩专区在线观看| 亚洲最大AV网站在线观看| 免费观看黄色的网站| 成年网在线观看免费观看网址 | 69视频在线是免费观看| 亚洲精品第一国产综合亚AV| 亚洲精品无码久久久久| 免费中文熟妇在线影片| 国产在线观a免费观看|