2012-07-27 3 views
0

사용자가 자신의 사용자 이름을 변경할 수있는 설정 페이지를 만들고 있습니다. 이상한 것은 주보기 및 양식에 표시하는 데 동일한 finder 메서드를 사용하지만 개체가 서로 관련이 없다는 것입니다.Model.find가 동일한 객체 참조를 반환합니다.

사용자 이름을 입력하고 저장을 클릭하면 부작용이 생깁니다. 두 개체가 모두 업데이트됩니다. 또한 잘못된보기에 표시됩니다.

단지 별도의 형태로 사용하고 싶습니다. 여기서 내가 뭘 잘못하고 있니? 나는 "Model.find"를 호출하면 매번 객체의 다른 참조가 반환된다고 생각했다. 여기서 지능적인 캐싱을하고있는 플레이인가?

폼에서 사용자를 변경하는 것은보기에서 다른 모든 동일한 사용자 개체를 변경한다는 것을 의미합니다.

은/편집을 만들 페이지 렌더링

작업 :

public static User findUser(UserId userId){ 
     User user = User.find("externalId = ? and provider = ?", userId.id, userId.provider.name()).first(); 
     return user; 
} 

감사

:

${models.User.findUser(user.id).username} 

내 모델 (사용자 이름 로그인 전류를 표시하는)

public static void index(){ 
     User appUser = User.findUser(SecureSocial.getCurrentUser().id); 
     render(appUser); 
} 

내보기

답변

0

Hibernate는 당신의 영속적 인 스토리지를 지원하고있다. Hibernate는 하나의 트랜잭션에서 하나의 영속적 인 (논리적 인) 객체에 대해서 여러 이유로 그 객체의 인스턴스 하나를 생성하고 유지한다. 그래서 당신이 묘사하는 행동은 실제로 기대됩니다.

자세한 내용은 http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html#objectstate-overview을 참조하십시오.

오브젝트의 두 인스턴스를 동시에 처리하려면 분리 (즉, 최대 절전 모드로 DB 오브젝트에 대한 링크 제거)해야합니다. 일반적으로 편집 된 객체를 분리하고 객체를 렌더링에만 사용합니다.

User.em().detach(user);

:

그래서 당신은 편집 객체를 분리하는 컨트롤러의 기능을 바꿀 것

관련 문제