[英]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.