1. 程式人生 > >JPA基礎學習二

JPA基礎學習二

       使用JPA中的生成表,還有很多細節,比如主鍵,JPA物件的四大物件,髒資料更新,域物件關係等等。上一篇我只是寫了一些基本的使用JPA。今天在這裡再詳細 的介紹下JPA的一些細節。

1.主鍵

1.1.自然主鍵:使用帶有業務功能的欄位作為主鍵

         一般說來我們是不建議使用自然主鍵,打個比方,在銀行的系統中,如果一個人只有一個身份證號,所以有一些程式設計師就使用生份證號作為主鍵,但是我們一個人可以有多個銀行卡,這樣就會出問題,所以不建議使用自然主鍵。

1.2.代理主鍵:就是使用沒有任何業務功能的欄位作為主鍵。

        我們可以在表中建立一列,比如id,它只是作為我們的主鍵。

1.3.主鍵生成的四種策略

  1. identity:自增 :MySQL, SQL Server, DB2,
  2. Sequence:序列:Oracle、PostgreSQL、DB2
  3. Table:相容所有資料庫:當我們要使用多個數據庫的時候 他使用一張表來模擬序列(效能低)
  4. auto:根據方言自動識別是自增還是序列

2.JPA物件的四大狀態

1.臨時:物件剛被創建出來

2.持久化:和EntityManager物件發生關係(一級快取)

3.遊離:持久化物件與EntityManager接觸關係(從快取中移除)

4.刪除:JPA特有的,執行remove方法時(並不是真正的刪除,只是將狀態轉換為計劃刪除)

3.髒資料更新

       一個持久狀態物件在事務管理內,如果改變原來的資料(非主鍵),此時出現髒資料,在事務提交的時候自動發出update語句去修改。

4.域物件關係

4.1.依賴關係

   表現層(controller)依賴業務層(service),業務層依賴持久化(dao)

4.2.關聯關係

  1. 多重性

      一對一:

  1. 共享主鍵:一般不用
  2. 唯一主鍵:拓展性更強

     多對一,一對多:使用外來鍵(外來鍵在哪,那一邊就是多的一方)

     多對多:使用中間表

  1. 導向性(資料庫沒有導向性)

   單向,多向

  1. 聚合關係:雙向的多對一,一對多
  2. 組合關係:強聚合(部分與整體不可分割)
  3. 泛化:就是繼承

4.3多對一的程式碼實現

    @ManyToOne(fetch = FetchType.LAZY)

    @JoinColumn(name = "manager_id")

    private Employee employee;

  1. ManyToOne:表示表關係
  2. Fetch:載入策略
  1. FetchType.LAZY:延時(懶)載入:就是使用的時候才到資料查詢
  2. FetchType.EAGER:及時載入:不管用不用,先的查出來
  3. JoinColumn:外來鍵的名字

5.二級快取

   其實我們一般不使用JPA的二級快取,一般使用的Spring的二級快取,所以在這裡我只是簡單的介紹下

5.1使用場景:

  1. 讀取大於修改:就是查詢的多,但是一般不會去修改,比如一個公司的部門
  2. 對資料有獨享控制:不會被第三方修改
  3. 允許無效資料:記住財務系統不要使用快取
  4. 資料大小不超過記憶體:超過就會鈍化:將資料存到硬碟中

5.2.如何使用

  1. 導包:

      <dependency>

            <groupId>org.hibernate</groupId>

            <artifactId>hibernate-ehcache</artifactId>

            <version>4.3.8.Final</version>

        </dependency>

  1. 配置:

     <persistence-unit name="cn.itsource.jpa" transaction-type="RESOURCE_LOCAL">

                <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

                <properties>

                    ....

                    <!-- 配置二級快取 -->

                    <!-- 開啟二級快取 -->

                    <property name="hibernate.cache.use_second_level_cache" value="true" />

                    <!-- 支援二級快取的工廠 -->

                    <property name=" hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />

                </properties>

            </persistence-unit>

  1. 註解

     @Cacheable