2012-03-27 6 views
0

테이블에 매핑되는 Person 테이블과 Person.java가 있습니다. 저는 Person 레코드의 세부 사항을 변경하기위한 편집 UI가 있습니다. 편집 페이지에서 사용자는 일반적으로 한 번에 1 또는 2 개의 필드를 변경합니다. 나는 AJAX를 사용하여 업데이트 호출을 보내고 변경된 필드 만 보내고 싶다. 현재 전체 개체를 다시 보냅니다.변경된 필드 만의 테이블 업데이트

문제는 백엔드에서 변경된 필드에 대해서만 데이터베이스를 업데이트하는 방법에 관한 것입니다.

UI 레이어는 변경된 필드 만 사용하여 Person 개체를 만들고 나머지 필드는 초기화되지 않습니다. 그런 다음 개체는 지속성을 위해 DAO로 전달됩니다. DAO는 어떤 필드가 변경되었는지 어떻게 알 수 있습니까? 어떤 필드가 초기화되지 않았거나 의도적으로 업데이트를 위해 null로 설정됩니다. 현재 전체 개체가 제공되므로 모든 열을 업데이트합니다.

+1

바위 같은 길로 느껴집니다. DB의 특정 필드 만 업데이트하는 이유는 무엇입니까? 사용자가 개체를 전체적으로 나타내는 폼에 데이터를 커밋하는 경우 전체 개체를 업데이트해야합니다. 필드를 업데이트하면 동시성 충돌을 어떻게 감지하고 처리합니까? (예를 들어, 두 명의 사용자가 동일한 Person의 서로 다른 필드를 거의 동시에 업데이트합니다. 각 사용자의 관점에서 전체 레코드가 정확합니다. 그러나이 방식으로 병합하면 올바르지 않습니다. – David

+0

레코드에 타임 스탬프가 있으므로 소요됩니다. 동시성. –

+0

그리고 기록의 어떤 필드가 타임 스탬프가 업데이트되었는지 표시합니까? 결국,이 디자인을 사용하여 사용자는 일부 필드 만 업데이트했으며 일부 필드는 업데이트하지 않았습니다. 따라서 감사 추적 관점에서 사용자는 실제로 업데이트하지 않은 데이터를 업데이트한다는 것을 기록합니다. – David

답변

0

내가 일반적으로하는 일은 데이터베이스의 모든 필드가있는 개체를 먼저 가져 오는 것입니다. 그런 다음 원하는 필드를 업데이트 한 다음 DAO로 다시 보냅니다. DAO는 무엇이든 상관없이 전체 개체를 업데이트합니다. 이렇게하면 DAO는 어떤 것이 변경되었는지에 상관하지 않습니다. 몇 가지 특수한 경우가 있지만 다른 DAO 메서드를 추가 할 수도 있습니다.

1

지속성을 위해 ORM (최대 절전 모드)을 사용하고 있다면 hibernate.merge를 사용하여 선택적 업데이트를 수행 할 수 있습니다.

JDBC 접근 방식 : UI를 채우는 데 사용되는 세션을 사용자가 편집 할 수있는 초기 값으로 유지하십시오. 사용자가 변경 사항을 제출하면 제출 된 값을 세션의 개체와 비교하고 필드 이름과 새 값이 포함 된 맵을 추가합니다. 이 맵을 사용하여 업데이트 쿼리를 동적으로 생성하십시오.