描述:實(shí)體對(duì)象屬于托管狀態(tài)下時(shí)蔑歌,往這個(gè)對(duì)象里面的某個(gè)屬性 set 新的值伦吠,這個(gè)新的值會(huì)被更新到數(shù)據(jù)表中去贮预。
使用 EntityManager.contains(entity) 方法可以得知某個(gè)實(shí)體對(duì)象是否處于托管狀態(tài)滑频,也就是說(shuō)是否處于 persistence context 中银伟。
使用 EntityManager.clear() 方法可以將處于 persistence context 范圍中的托管對(duì)象變?yōu)橛坞x對(duì)象彤避,這時(shí)重置屬性值不會(huì)更新到數(shù)據(jù)表中去。
persistence context 有兩種類型蒿褂。一種稱為 transaction-scope persistence context,在這種狀態(tài)下 persistence context 是與事務(wù)相關(guān)的块茁,也就是說(shuō)在事務(wù)范圍內(nèi)托管對(duì)象所有的更改都會(huì)被更新到數(shù)據(jù)表中去永淌,當(dāng)事務(wù)提交后遂蛀,這個(gè) persistence context 也就銷毀了螃宙,之后的更改不會(huì)被更新到數(shù)據(jù)表中去。
另一種稱為 extended persistence context堂湖,在這種狀態(tài)下 persistence context 并不會(huì)因事務(wù)提交而銷毀伺糠,而是可以跨事務(wù)的,具體的銷毀與客戶端請(qǐng)求有關(guān),一般用于 Stateful Session Bean 中琉朽。
一般使用的 persistence context 都是默認(rèn)的 transaction-scoped,extended 的很少用到。
在 transaction-scoped 環(huán)境中螟够,受托管的實(shí)體對(duì)象并在事務(wù)環(huán)境中,這時(shí)重置屬性值會(huì)更新到數(shù)據(jù)表中去。如果實(shí)體對(duì)象為游離對(duì)象,也就是說(shuō)已經(jīng)從 persistence context 游離出來(lái)了,這時(shí)重置屬性值不會(huì)更新到數(shù)據(jù)表中去篷就,如果需要將游離對(duì)象重置的值更新到數(shù)據(jù)表中去永品,需要使用 EntityManager#merge(entity) 方法钾麸,將該游離對(duì)象納入當(dāng)前 persistence context 的管轄之中重新成為托管對(duì)象炕桨。
@PersistenceContext private EntityManager entityManager;
...{
---省略代碼---
ScorePoint scorePoint = scorePointSecDao.findScorePointById(groupId,scorePointId);
if(entityManager.contains(scorePoint)){
logger.info("實(shí)體對(duì)象屬于托管狀態(tài)下時(shí)饭尝,往這個(gè)對(duì)象里面的某個(gè)屬性 set 新的值,這個(gè)新的值會(huì)被更新到數(shù)據(jù)表中去献宫。"
- "使用 EntityManager#contains(entity) 方法可以得知某個(gè)實(shí)體對(duì)象是否處于托管狀態(tài)钥平,也就是說(shuō)是否處于 persistence context 中");
entityManager.clear();
logger.info("entityManager.clear()方法被調(diào)用,已經(jīng)被清理");
}