JPA基礎學習二
使用JPA中的生成表,還有很多細節,比如主鍵,JPA物件的四大物件,髒資料更新,域物件關係等等。上一篇我只是寫了一些基本的使用JPA。今天在這裡再詳細 的介紹下JPA的一些細節。
1.主鍵
1.1.自然主鍵:使用帶有業務功能的欄位作為主鍵
一般說來我們是不建議使用自然主鍵,打個比方,在銀行的系統中,如果一個人只有一個身份證號,所以有一些程式設計師就使用生份證號作為主鍵,但是我們一個人可以有多個銀行卡,這樣就會出問題,所以不建議使用自然主鍵。
1.2.代理主鍵:就是使用沒有任何業務功能的欄位作為主鍵。
我們可以在表中建立一列,比如id,它只是作為我們的主鍵。
1.3.主鍵生成的四種策略
- identity:自增 :MySQL, SQL Server, DB2,
- Sequence:序列:Oracle、PostgreSQL、DB2
- Table:相容所有資料庫:當我們要使用多個數據庫的時候 他使用一張表來模擬序列(效能低)
- auto:根據方言自動識別是自增還是序列
2.JPA物件的四大狀態
1.臨時:物件剛被創建出來
2.持久化:和EntityManager物件發生關係(一級快取)
3.遊離:持久化物件與EntityManager接觸關係(從快取中移除)
4.刪除:JPA特有的,執行remove方法時(並不是真正的刪除,只是將狀態轉換為計劃刪除)
3.髒資料更新
一個持久狀態物件在事務管理內,如果改變原來的資料(非主鍵),此時出現髒資料,在事務提交的時候自動發出update語句去修改。
4.域物件關係
4.1.依賴關係
表現層(controller)依賴業務層(service),業務層依賴持久化(dao)
4.2.關聯關係
- 多重性
一對一:
- 共享主鍵:一般不用
- 唯一主鍵:拓展性更強
多對一,一對多:使用外來鍵(外來鍵在哪,那一邊就是多的一方)
多對多:使用中間表
- 導向性(資料庫沒有導向性)
單向,多向
- 聚合關係:雙向的多對一,一對多
- 組合關係:強聚合(部分與整體不可分割)
- 泛化:就是繼承
4.3多對一的程式碼實現
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "manager_id")
private Employee employee;
- ManyToOne:表示表關係
- Fetch:載入策略
- FetchType.LAZY:延時(懶)載入:就是使用的時候才到資料查詢
- FetchType.EAGER:及時載入:不管用不用,先的查出來
- JoinColumn:外來鍵的名字
5.二級快取
其實我們一般不使用JPA的二級快取,一般使用的Spring的二級快取,所以在這裡我只是簡單的介紹下
5.1使用場景:
- 讀取大於修改:就是查詢的多,但是一般不會去修改,比如一個公司的部門
- 對資料有獨享控制:不會被第三方修改
- 允許無效資料:記住財務系統不要使用快取
- 資料大小不超過記憶體:超過就會鈍化:將資料存到硬碟中
5.2.如何使用
- 導包:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>4.3.8.Final</version>
</dependency>
- 配置:
<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>
- 註解
@Cacheable