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\3個jar文件
<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