2013-09-06 3 views
0

컨트롤러 서비스 저장소 아치를 고려하십시오.관리해야하는 경우 엔티티가 분리됩니다.

TokenService에서 성공적으로 수행 한 성공적인 방법입니다. 당신이 컨트롤러 호출 내부의 다음 setTokenType 따라서 나는라고 아무것도하지 않는 코멘트에서 볼 수 있듯이

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); 

     } 

:

@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; 
} 

이제 우리는 내부 컨트롤러 핸들러 맵핑 이전 서비스 메소드를 호출하고 토큰을 추출입니다 save 더 이상 추측하지 않고 나에게 개체가 분리되었음을 알리는 상태를 확인합니다.

서비스 클래스 내에서 모든 변경을 수행해야한다는 것을 의미합니까? 컨트롤러 컨텍스트가 잘못된 이유는 하나의 뮤 테이타를 호출 할 필요가 있다면 컨트롤러 O.o에서 전체 저장소 - 체인을 만들어 강제로 만들고 싶지는 않을 것입니다.

나는 컨트롤러 컨텍스트를 설명하기 위해 몇 가지 마법 필터가 필요하다는 것을 기억하고있다. 그러나 그것은 오래 전이었고 어떤 종류의 필터가 필요한지를 기억할 수 없다. 어쩌면 나는 완전히 틀리다.

이 난 .flush 내가 서비스 트랜잭션을 선언하는 것을 잊지 때마다 예외가 발생 asfaik 때문에 컨트롤러 내부 merge에 나는 것 수 의심한다. 그리고 컨트롤러 처리기 메소드를 트랜잭션으로 선언하고 지속성 컨텍스트를 autowire로 선언하여 병합을 호출하는 것이 가능하거나 정확할 수도 있습니다.

물론 이상적인 시나리오는 컨트롤러 체인 호출에 의해 검색되는 경우에도 엔터티의 영구 상태를 유지하는 것입니다.

답변

0

해당 메소드를 트랜잭션으로 선언하면 트랜잭션이됩니다. 그뿐입니다.

트랜잭션이 완료되면 관련된 참조 개체가 세션에서 더 이상 관리되지 않는다는 의미에서 변경을 수행 할 수 없습니다. (거래가 끝났기 때문에).

관리되는 상태에서 개체를 변경하려면 트랜잭션 방식에서 개체를 변경해야합니다 (동일한 트랜잭션 내에서).

+0

hm, 엔티티가 컨트롤러에 전달되어 자동으로 분리 될 수 있다면 명명 된 쿼리에서 "새"키워드의 요점은 무엇입니까? 당신이 말한 것은 엔티티를 컨트롤러에 전달할 때마다보기 요구 사항을 충족하기 위해 안전하게 수정할 수 있고 사용자에게 표시된다는 것을 의미합니까? – Aubergine

관련 문제