考虑 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
asfaik 甚至会抛出异常。.flush
而且我怀疑直接声明控制器处理程序方法事务和自动装配持久性上下文只是为了调用合并是可能的,甚至是正确的。
理想的场景当然是保持实体的持久状态,即使它被控制器链调用检索。