Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实体在应该管理时被分离_Java_Spring_Jpa_Jpa 2.0_Three Tier - Fatal编程技术网

Java 实体在应该管理时被分离

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

考虑控制器服务存储库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 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”关键字有什么意义?您所说的意味着,每当我将实体传递给控制器时,它们都可以被安全地修改(以满足视图要求)并显示给用户?