0

考虑 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

我记得在我脑海深处的某个地方,需要一些神奇的过滤器来解释控制器上下文,但那是很久以前的事了,我不记得需要什么样的过滤器。也许我完全错了。

我怀疑我是否能够进入控制器,因为每当我忘记声明服务事务时,mergeasfaik 甚至会抛出异常。.flush而且我怀疑直接声明控制器处理程序方法事务和自动装配持久性上下文只是为了调用合并是可能的,甚至是正确的。

理想的场景当然是保持实体的持久状态,即使它被控制器链调用检索。

4

1 回答 1

0

当您声明该方法为事务性时,它将是事务性的。那个,只有那个。

事务完成后,您无法对其进行任何更改,因为无论您与之关联的任何引用对象都不再由会话管理。(因为交易已经结束)。

如果要更改处于托管状态的对象,请在其自身的事务方法中执行此操作(在同一事务中)。

于 2013-09-06T03:11:40.647 回答