日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

休眠CascadeType.LOCK陷阱

發布時間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 休眠CascadeType.LOCK陷阱 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

引入了Hibernate 顯式鎖定支持以及Cascade Types之后 ,就該分析CascadeType.LOCK行為了。

休眠鎖定請求觸發內部LockEvent 。 關聯的DefaultLockEventListener可以將鎖定請求級聯到鎖定實體子級。

由于CascadeType.ALL也包括CascadeType.LOCK ,因此當鎖定請求從父級實體傳播到子級實體時,值得理解。

測試時間

我們將從以下實體模型開始:

Post是PostDetail一對一關聯和Comment一對多關聯的Parent實體,這些關聯用CascadeType.ALL標記:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "post", orphanRemoval = true) private List<Comment> comments = new ArrayList<>();@OneToOne(cascade = CascadeType.ALL, mappedBy = "post", optional = false, fetch = FetchType.LAZY) private PostDetails details;

所有即將到來的測試用例將使用以下實體模型圖:

doInTransaction(session -> {Post post = new Post();post.setName("Hibernate Master Class");post.addDetails(new PostDetails());post.addComment(new Comment("Good post!"));post.addComment(new Comment("Nice post!"));session.persist(post); });

鎖定管理實體

將受管實體加載到當前正在運行的持久性上下文中,并將所有實體狀態更改轉換為DML語句。

當托管父實體被鎖定時:

doInTransaction(session -> {Post post = (Post) session.createQuery("select p " +"from Post p " +"join fetch p.details " +"where " +" p.id = :id").setParameter("id", 1L).uniqueResult();session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_WRITE)).lock(post); });

只有父實體被鎖定,因此可以防止級聯:

select id from Post where id = 1 for update

Hibernate定義了一個范圍 LockOption ,該范圍 (根據JavaDocs)應允許將鎖定請求傳播到Child實體:

“范圍”是JPA定義的術語。 基本上,這是關聯鎖定的級聯。

session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_WRITE)) .setScope(true) .lock(post);

設置范圍標志不會改變任何東西,只有被管理實體被鎖定:

select id from Post where id = 1 for update

鎖定獨立實體

除了實體鎖定之外,鎖定請求還可以重新關聯分離的實體。 為了證明這一點,我們將在鎖定實體請求之前和之后檢查Post實體圖:

void containsPost(Session session, Post post, boolean expected) {assertEquals(expected, session.contains(post));assertEquals(expected, session.contains(post.getDetails()));for(Comment comment : post.getComments()) {assertEquals(expected, session.contains(comment));} }

以下測試演示了CascadeType.LOCK如何用于分離的實體:

//Load the Post entity, which will become detached Post post = doInTransaction(session -> (Post) session.createQuery("select p " +"from Post p " +"join fetch p.details " +"join fetch p.comments " +"where " +" p.id = :id") .setParameter("id", 1L) .uniqueResult());//Change the detached entity state post.setName("Hibernate Training"); doInTransaction(session -> {//The Post entity graph is detachedcontainsPost(session, post, false);//The Lock request associates //the entity graph and locks the requested entitysession.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_WRITE)).lock(post);//Hibernate doesn't know if the entity is dirtyassertEquals("Hibernate Training", post.getName());//The Post entity graph is attachedcontainsPost(session, post, true); }); doInTransaction(session -> {//The detached Post entity changes have been lostPost _post = (Post) session.get(Post.class, 1L);assertEquals("Hibernate Master Class", _post.getName()); });

鎖定請求重新關聯了實體圖,但是當前正在運行的Hibernate Session并未意識到處于分離狀態的實體變臟了。 僅在不強制執行UPDATE或選擇當前數據庫狀態進行進一步比較的情況下,才重新連接實體。

一旦對實體進行管理, 臟檢查機制將檢測到任何進一步的更改,并且刷新也會傳播重新附加的更改。 如果在管理實體時未發生任何更改,則不會安排該實體進行刷新。

如果要確保分離的實體狀態始終與數據庫同步,則需要使用merge或update 。

當scope選項設置為true時,分離的實體傳播lock選項:

session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_WRITE)) .setScope(true) .lock(post);

Post實體鎖定事件會傳播到所有Child實體(因為我們正在使用CascadeType.ALL ):

select id from Comment where id = 1 for update select id from Comment where id = 2 for update select id from PostDetails where id = 1 for update select id from Post where id = 1 for update

結論

鎖級聯不是簡單明了或直觀的。 顯式鎖定需要勤奮(我們獲取的鎖越多,死鎖的機會就越大),并且無論如何,最好保留對Child實體鎖傳播的完全控制權。 因此,與并發編程最佳實踐類似,手動鎖定優于自動鎖定傳播。

  • 代碼可在GitHub上獲得 。

翻譯自: https://www.javacodegeeks.com/2015/03/hibernate-cascadetype-lock-gotchas.html

總結

以上是生活随笔為你收集整理的休眠CascadeType.LOCK陷阱的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色大片黄色大片 | 日韩av线上 | 本道久久 | 亚洲免费观看高清在线观看 | 99热在线这里只有精品 | 天堂中文字幕 | 日韩电影一区二区三区四区 | 重口变态虐黄网站 | 亚洲欧美日韩一区二区 | 136福利视频导航 | 亚洲第一成人在线 | 黄色三级网络 | 免费二区 | 久久久中文网 | 天天干夜夜夜 | 99视屏| 久久精品香蕉 | 粉嫩av一区二区 | 中文字幕精品一区二区精品 | 中文字幕视频二区 | 亚洲精品久久久久久久久久 | 毛片a片免费观看 | 桃色av | 狠狠精品干练久久久无码中文字幕 | 人妻无码中文字幕免费视频蜜桃 | 午夜aaa片一区二区专区 | 99久久婷婷国产一区二区三区 | 日韩av成人 | 中文字字幕在线中文 | 国产特级视频 | 2019亚洲男人天堂 | 天美麻花果冻视频大全英文版 | 九色91| 欧美淫视频 | 反差在线观看免费版全集完整版 | 青青草原国产视频 | 午夜寂寞少妇 | 亚洲看片 | 亚洲 激情 小说 另类 欧美 | 波多野结衣乳巨码无在线 | 天天操天天干天天舔 | 1024av在线| 欧美成人综合一区 | 国产微拍精品 | 久久影片| 国产精品--色哟哟 | 成人在线免费视频观看 | 色批网站| 欧美爱爱网 | 大地资源影视在线播放观看高清视频 | 久久精品影视 | 波多野结衣久久 | 亚洲国产成人自拍 | 手机在线免费看av | 色永久| 四虎最新网址在线观看 | 少妇高潮21p | 国产精品无人区 | 色成人亚洲 | 国产精品永久免费观看 | 日本中文字幕久久 | 久久久久久少妇 | 视频一区二区三区在线观看 | 国产视频福利 | 亚洲色图制服诱惑 | 日本少妇喷水视频 | 欧美日韩一区二区在线观看视频 | 亚洲成年人免费观看 | 一级黄色a视频 | 色网址在线 | 久久综合婷婷国产二区高清 | 2024av视频| 欧美又粗又长又爽做受 | 日本在线一级片 | www夜片内射视频日韩精品成人 | 91大神在线看| 91爱爱网 | 午夜久久影院 | 黄色污污网站 | 成人福利网址 | 98国产视频 | 青青青手机视频 | 香蕉视频一级 | 51自拍视频 | 老色批网站 | 午夜精品久久久久久 | 青青草视频免费播放 | 国产伦理久久精品久久久久 | 久久色在线 | 精品国产AV色欲天媒传媒 | 久久久免费 | 一级免费a | 日韩在线一二三 | 91精品国产一区 | 国产精品久久久久久久久岛 | 九色在线| 国产又黄又粗的视频 | 狠狠干很很操 | 成人午夜视频免费 |