Udemy Course Spring JPA 9

深入EntityManager 踩雷!!

ZONGRU Li
3 min readApr 26, 2019

在CourseRepository中加入新Method=>playWithEntityManager

注意! 在playWithEntityManager()內只做三件事

  1. 建一個Course物件(課程名稱帶Web Service in 100 steps)
  2. 將上述物件INSERT進DB
  3. 改寫上述物件的課程名稱為:Web Service in 100 steps — Update!!!!!!!!!

(也就是將這物件名稱改寫

但沒有再用EntityManager的merge(即update)進DB)

接著在DemoApplication呼叫playWithEntityManager

執行得

多了update的動作

http://localhost:8090/h2-console觀察

綜上所述,當物件由EntityManager接手後(如上em.persist(course);)

EntityManager就會一直追著這個course物件!!

只要對該course物件進行操作,EntityManager將會把DB資料同步改寫

所以在course.setName後我們不用再補上em.merge(course)

繼續討論EntityManager如何控制Entity物件

改寫playWithEntityManager Method

再執行DemoApplication得

講解playWithEntityManager()

過程建了兩個Course,course1 & course2

一個是Web Service開頭,一個是Angular Service開頭

利用EntityManager的flush(),每異動一部分就連動到DB

但是course2在INSERT結束後使用EntityManager的detach()功能

將course2踢除於EntityManager管理

所以此時再做course2改寫名子就不再同步到DB了

同理改寫playWithEntityManager()

用EntityManager的clear()將所有管控的Entity物件替無控制

執行DemoApplication得

執行的course1.setName & course2.setName都將不會造成DB內的資料改變

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet