2017-01-23 10 views
0

프로젝트가 플레이 프레임 워크 1.3.3 을 사용하고 1.3.3 및 최대 절전 모드 캐시가 나는 등의 컨트롤러가 있습니다플레이 프레임 워크

public static void save(Item item) { 
    if (item.id != null) { //It means that item is not new, it is being edited 
     Item existingOldItem = Item.findById(item.id); 
     //Here I should have an old version of an item as "existingOldItem" 
     //and new one coming from http request as "item" 
    } 

을 그러나 문제는 항목과 existingOldItem 아주 동일하다. Item.findById 행은 데이터베이스에서 이전 항목을 반환하지 않지만 HTTP 요청 (JPA.em(). createQuery와 동일)에서 새 항목을 반환합니다. 재생 프레임 워크가 캐시에 새 항목을 보내고 findById가 데이터베이스가 아닌 캐시에서 항목을 반환한다고 가정합니다. 제발, 누군가가 나에게 그것의 논리와 문제를 해결하는 방법을 설명 할 수 있을까요?

답변

3

문제는 항목이며 existingOldItem은 매우 동일합니다. Item.findById 라인이 데이터베이스에서 이전 항목을 반환하지 않습니다.

예상되는 동작입니다. Item.findById()는 HTTP 클라이언트가 수정 한 이전 항목을 반환합니다. Play에서 JPA object binding을보세요! 호출 패턴을보기위한 문서.

제발 누군가가 나에게 그 뒤에 논리를 설명 할 수 ... 한마디로

는 HTTP 클라이언트는 HTTP 요청의 항목 레코드의 ID 및 새로운 속성 값을 제공 할 것으로 기대된다 . 놀이! item 매개 변수를 저장할 준비가되어 데이터베이스의 항목을 찾고 POST 매개 변수에 따라 속성을 수정합니다. 따라서 "오래된"항목과 "새 항목"을 가져서는 안되며, HTTP 클라이언트가 제공 한 ID가 에 있는지 여부에 따라 오래되거나 새로운 항목 인 "항목"개체 만 있어야합니다. 데이터베이스 컨트롤러의 모든 작업은 item.save()을 호출하는 것입니다.

마법은 JPAPlugin.bind입니다. 추측 하듯이, 먼저 데이터베이스에서 오브젝트를 찾습니다. 개체를 찾으면 해당 개체를 사용하여 Item.edit()을 호출합니다. 이것은 또한 마법이며, 기본 구현은 일치하는 HTTP 매개 변수가있는 Item의 모든 속성을 설정합니다.

... 및 문제 해결 방법.

은 당신이 될 수있는 문제를 고려 모르겠어요,하지만 당신은 오래된 새로운 아이템을 원하는 경우, 다음 클라이언트는 item.id 매개 변수를 제공하지 않아야합니다. 당신이 그 놀이를 좋아하지 않는다면! 데이터베이스에 넣고 item 매개 변수를 인스턴스화하면 사용자 정의 바인더를 제공하거나 컨트롤러 조치가 JPA 클래스 대신 비슷한 POJO 클래스를 허용하게 할 수 있습니다.

+0

감사! JPA를 사용하는 웹 프레임 워크의 정상적인 동작입니까 아니면 그냥 Play입니까? 맡은 일? –

+0

이것은 Play입니다! 특유한. 다른 웹 프레임 워크가 똑같은 일을하는 경우 우연의 일치입니다. item.save()가 Play이기 때문에 다른 프레임 워크가이 작업을 수행하면 놀랍습니다. JPA 엔티티가 일반적으로 작동하는 방식이 아닙니다. 다른 프레임 워크가 JPA 객체를 메모리 내에서 수정 한 경우, Hibernate는 응용 프로그램 로직이이를 거부 할 기회없이 데이터베이스에 변경 사항을 플러시 할 수 있습니다. 그러나 Play!에서 변경 사항을 플러시하려면 응용 프로그램 논리에서 save()를 호출해야합니다. –