Jpa持久對象狀態,一級緩存,二級緩存


1JPA持久對象的狀態

1.1. 臨時狀態(transient):瞬時狀態

剛剛用new語句創建,沒有和entityManager發生關系

沒有被持久化,不處於entityManager中。該對象成為臨時對象

1.2. 持久化狀態(persistent):托管狀態

entityManager發生關系

已經被持久化,加入到entityManager的一級緩存中(persist  merge remove )

 @Test
    public void testUpdateid()throws Exception{
        EntityManager entityManager = JpaUtil.getEntityManager();
        entityManager.getTransaction().begin();

        OIDDomain Domain = entityManager.find(OIDDomain.class, 1L);// 持久狀態
        Domain.setName("小17");
        //一級緩存
        //entityManager.persist(Domain);// 持久狀態
//提交事務
        entityManager.getTransaction().commit();
        entityManager.close();// 游離狀態
    }

 

 

 

該狀態的對象為持久化對象。

1.3. 游離狀態(detached):脫管狀態

已經被持久化,但不處於entityManager中。

該狀態的對象為游離對象。

1.4. 刪除狀態(removed):從JPA才開始有的狀態

只有調用了entityManager.remove(domain對象)方法

對象有關聯的ID,並且在entityManager管理下,

但是已經被計划刪除,事務提交就真的被刪除了。

1.5. 臟數據更新

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

 

 @Test
public void testUpdateid()throws Exception{
EntityManager entityManager = JpaUtil.getEntityManager();
entityManager.getTransaction().begin();

OIDDomain Domain = entityManager.find(OIDDomain.class, 1L);// 持久狀態
Domain.setName("小17");
//一級緩存
//entityManager.persist(Domain);// 持久狀態
//提交事務
entityManager.getTransaction().commit();
entityManager.close();// 游離狀態
}

 

 

1.5 執行流程分析

JPAUtil獲取entityManager,開啟事務

通過entityManager拿到一個對象,那么現在這個對象就是持久化的對象

這個對象會放到一級緩存里面

JPA會為當前這個對象准備一個快照(把這個對象進行了備份)

第三步:提交事務

它會把快照 你現在這個對象的數據進行對比

如果相同,就不需要修改,也不會發送SQL(性能就高了)

當不相同的時候,JPA就會認為現在這個數據是臟數據

臟數據它就會在事務提交的時候,把它進行數據庫的同步(發送update SQL語句)

Hibernate: update t_iod set name=? where id=?

2'domain對象之間的關系

 

2.1. 依賴關系

 

Spring管理對象之間相互依賴注入

 

Controller表現層依賴於Service業務層,Service依賴於Dao持久層

 

2.2. 關聯關系

 

關聯按照多重性可分為一對一、一對多、多對一和多對多。 主要指的數據庫()的關系

 

按照導航性可分為單向關聯和雙向關聯。

  喜歡一個人,但是他不認識 單相思

  一對夫妻 我中有你 你中有我,雙向的

 

2.3. 聚合關系(本質還是雙向多對一,一對多)

 

表示整體與部分的關系,整體和部分可以分開單獨存在。

 

一個男的對應多個女的 ,這多個女的每人都有自己圈子,這個gay說不定還有個gay;

一個妓院 老鴇跑路了,手下妹子還能單獨接客,牛郎還能繼續旁

 

2.4. 組合關系(本質還是聚合關系,雙向多對一,一對多)

 

一個訂單

2.5代碼分析多對一

@Entity
@Table(name = "t_product")
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
private String address;
@ManyToOne//FetchType.EAGER迫切加載
@JoinColumn(name ="dir_id")
private ProductDir dir;

正確寫法:先保存一方,再保存多方

 

 

 

3一級何二級緩存

緩存就是,犧牲內存換取時間

一級緩存就是同一個entitymanagerfactory 同一個entitymanager 同oid(默認的)

 

3.2.1. 添加二級緩存jar文件

pml配置這個導報

 

hibernate-release-4.3.8.Final\lib\optional\ehcache\3jar文件

 

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>4.3.8.Final</version>
</dependency>

 

 

 

3.2.2. 搜索配置信息Cache

 

添加persistence.xml配置信息

 

<!-- 啟用二級緩存 -->

 

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

 

<!-- 二級緩存的實現類,文檔里面的包名有錯的 -->

 

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

 

<!-- 啟用查詢緩存 -->

 

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

 

1.2. <properties>上面添加配置二級緩存掃描的策略

 

<!-- ALL:所有的實體類都被緩存 -->

 

<!-- NONE:所有的實體類都不被緩存. -->

 

<!-- ENABLE_SELECTIVE:標識 @Cacheable(true) 注解的實體類將被緩存 -->

 

<!-- DISABLE_SELECTIVE:緩存除標識 @Cacheable(false) 以外的所有實體類 -->

 

<!-- UNSPECIFIED:默認值,JPA 產品默認值將被使用 -->

 

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

 

1.3. domain類的二級緩存

 

二級緩存類配置:命中條件:同一個SessionFactory,不同的entityManager,OID相同

 

 

// @Entity

 

// @Cacheable(true)

 

// public class Department

 

 

 

 

 
        

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM