Hibernate學習筆記(一)

session的load和get加載

Load加載如果找不到會返回ObjectNotFoundException異常
Get加載如果找不到返回null,null在java中是關鍵字,無任何值也不是對象

減少多表關聯時查詢產生的過多select語句

明確要查詢的字段屬性,可以減少大量select語句:

#改進前的HQL語句:
from Msg m left join m.from where m.to.uid=:to_uid order by m.createTime desc
#改進後的HQL語句:
select m.mid,m.from.account,m.content,m.createTime from Msg m left join m.from where m.to.uid=:to_uid order by m.createTime desc

數據列Column屬性

name 列名(默認值是屬性名)
unique 是否在該列上設置唯一約束(默認值false)
nullable 是否設置該列的值可以爲空(默認值false)
insertable 該列是否作爲生成的insert語句中的一個列(默認值true)
updatable 該列是否作爲生成的update語句中的一個列(默認值true)
columnDefinition 爲這個特定列覆蓋sql ddl片段(這可能導致無法在不同數據庫間移植)
table 定義對應的表(默認爲主表)
length 列長度(默認值255)
precision 列十進制精度(decimal precision)(默認值0)
scale 如果列十進制數值範圍(decimal scale)可用,在此設置(默認值0)

數據表關聯的cascade屬性:

CascadeType.persist級聯新建
CascadeType.remove級聯刪除
CascadeType.refresh級聯更新
CascadeType.merge級聯更新、刪除
CascadeType.all全部四項

主鍵生成策略GeneratedValue:

GenerationType.auto主鍵由程序控制
GenerationType.table 使用一個特定的數據庫表格來保存主鍵
GenerationType.identity 主鍵由數據庫自動生成(主要是自動增長類型)
GenerationType.sequence 根據底層數據庫的序列來生成主鍵,條件是數據
庫支持序列。(這個值要與generator一起使用)

Hibernate數據的三種狀態:瞬時態、持久態、脫管態

瞬時態:transient,session沒有緩存對象,數據庫也沒有對應記錄。
OID特點:沒有值
持久態:persistent,session緩存對象,數據庫最終會有記錄。(事務沒有提交,數據庫沒記錄)
OID特點:有值
脫管態:detached,session沒有緩存對象,數據庫有記錄。
OID特點:有值
在hql中不能通過給查詢出來的字段設置別名,別名只能設置在from後面

Hibernate的6個AIP

Session
SessionFactory
Configuration
Transaction
Query
Criteria

多對多關係:教師和任課

誰維護關係就添加誰,這個對象歸你控制,你就能夠級聯,它不歸你一個人所有,那你就不要級聯。

Course:
        private Set<Course> courses;
        @ManyToMany(mappedBy = "teachers")
Teacher:
        private Set<Teacher> teachers;
        @ManyToMany(cascade = CascadeType.ALL)
        @JoinTable(name = "t_teacher_course",
                joinColumns = {@JoinColumn(name = "cid")},
                inverseJoinColumns = {@JoinColumn(name = "tid")})

一對多關係:學生和班級

建立一對多關係關係的表的原則是將一的一方的主鍵加入到多的一方的表作爲外鍵。

Student:
        private ClassRoom room;
        @ManyToOne
        @JoinColumn(name = "rid", referencedColumnName = "id")
ClassRoom:
        private transient Set<Student> students;
        @OneToMany(mappedBy = "room")

一對一:人員和身份證

一對一默認執行的檢索方式是外連接檢索方式,可以設置one-to-one的fetch屬性,select或jion。
將待加載的一方的class元素中的lazy屬性默認爲true,加載時默認使用左外連接,可以通過修改fetch屬性爲select修改成每次發送一條select語句的形式。

IDCard:
        @OneToOne
        private Person person;
        @JoinColumn(name = "person_id", insertable = false, updatable = false)
Person:
        private IDCard idCard;
        @OneToOne(mappedBy = "person")

EhCache:

基本配置:
    <!--配置使用二級緩存-->
    <property name="hibernate.cache.use_second_level_cache">true</property>
    <!--配置二級緩存的實現類-->
    <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
四個緩存區:
    類緩存:(用來存數據)
        <!--配置類緩存區中,緩存那個類-->
        <class-cache class="" usage="read-only"/>
    集合緩存:(存對象ID,集合ID)
        <class-cache class="" usage="read-only"/>
        <collection-cache collection="com.cheng.entity.Course.teachers" usage="read-only"/>
    查詢緩存:(存查詢語句,結果ID)
        使用二級緩存,使用時指定緩存哪個,可以避免浪費資源
        query.setCacheable(true);
        <!--使用查詢緩存,針對hql-->
        <property name="hibernate.cache.use_query_cache">true</property>
    注意:
    集合緩存和查詢緩存使用的對象,應該在類緩存中配置,根據id才能從類緩存中找到數據,如果類緩衝區找不到,就發送sql語句根據id查找,然後將結果放入二級緩存

    時間戳緩存:
        記錄表以及最後操作的時間,來確保二級緩存中的數據是有效的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章