[英]Entity gets detached when should be managed
考慮Controller-Service-Repository拱。
TokenService中成功的方法聲明我是正確的。
@Transactional
public Token getByString(String tokenString) {
Token t = tr.loadTokenByString(tokenString);
t.setTokenType("SERVICE MODIF"); // note this test line works and changes are propagated to db
em.flush();
return t;
}
現在,我們在控制器處理程序映射內部,調用先前的服務方法並提取令牌:
logger.info(urlToken);
Object obj;
Token token;
obj = tokenService.getByString(urlToken);
User u;
if (obj != null) {
token = (Token) obj;
// tokenService.save(token); - am angry lost detached entity throwing exception that i am detached
token.setTokenType("helllo"); // this does not propagate to db since entity is detached
logger.info(token.toString());
u = token.getUser();
userService.activateUser(u);
}
從注釋中可以看到,控制器調用中的下一個setTokenType
不執行任何操作,因此我調用save
檢查狀態,而無需進一步猜測就通知我該實體已分離。
這是否意味着我必須在服務類中進行所有更改? 控制器上下文有什么問題,如果我只需要調用一個mutator,我就不會被迫創建整個存儲庫服務鏈來由控制器Oo來實現
我回想起在大腦深處的某個地方,需要一些神奇的過濾器來說明控制器的上下文,但是那是很久以前的事了,我無法回憶起需要哪種過濾器。 也許我是完全錯誤的。
我懷疑我是否能夠在控制器內部merge
,因為每當我忘記聲明服務為事務性時,即使.flush
甚至.flush
引發異常。 我懷疑直接聲明控制器處理程序方法事務性和自動裝配持久性上下文以調用合並是否可能甚至正確。
當然,理想的情況是即使通過Controller鏈調用檢索到實體,也要保持實體的持久狀態。
當您聲明該方法為事務性時,它將是事務性的。 那並且只有那。
事務完成后,您將無法對此進行任何更改,從某種意義上說,與您關聯的任何引用對象都不再由會話管理。 (因為交易結束)。
如果要更改處於托管狀態的對象,請使用自身(在同一事務中)的事務方法進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.