Java 实体在应该管理时被分离
考虑控制器服务存储库arch TokenService中的成功方法,声明我的观点正确Java 实体在应该管理时被分离,java,spring,jpa,jpa-2.0,three-tier,Java,Spring,Jpa,Jpa 2.0,Three Tier,考虑控制器服务存储库arch 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
@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,我不想被迫创建一个完整的存储库服务链,使其从控制器O.O
我记得在我大脑深处的某个地方,需要一些神奇的过滤器来解释控制器上下文,但那是很久以前的事了,我记不起需要什么样的过滤器。也许我完全错了
我怀疑我是否能够在控制器内部合并,因为每当我忘记声明服务事务时,asfaik甚至.flush
都会抛出异常。我怀疑仅仅为了调用merge而直接声明controller handler方法transactional和autowire持久性上下文是可能的,甚至是正确的
当然,理想的情况是即使在控制器链调用检索到实体时,也要保持实体的持久状态。当您声明该方法是事务性的时,它将是事务性的。那个,只有那个
事务完成后,您不能对其进行任何更改,因为您与之关联的引用对象不再由会话管理。(因为交易已经结束)
如果要更改处于托管状态的对象,请在事务方法中自行更改(在同一事务中)。hm如果可以通过将实体传递给控制器来自动分离实体,则命名查询中的“new”关键字有什么意义?您所说的意味着,每当我将实体传递给控制器时,它们都可以被安全地修改(以满足视图要求)并显示给用户?