2012-08-01 1 views
0

다음 작업을 수행합니다.여러 객체의 상태가 사소한 변화를 감지했습니다.

내가 작업하는 응용 프로그램에서 사용자는 여러 탭에서 다소 큰 개체를 정의 할 수 있습니다. 각 탭에는 정보가 저장된 해당 데이터베이스 테이블과이를 나타내는 Java 객체가 있습니다. 이것은 마법사처럼 작동하므로 편리합니다. 사용자는 한 곳에서 시작하여 몇 가지 단계 (선택에 따라 달라짐)를 완료해야한다는 것을 알고 언제든지 중단하고 원할 때 계속 진행할 수 있습니다. 데이터베이스 이 엔티티를 정의한 후, 그는 자신이 정의한 결과를 볼 수있는 "실행"모드로 전환 할 수 있습니다. 결과는 종종 많으며 여러 페이지에 걸쳐 있습니다. "실행"페이지 사이의 탐색 중에 컨플릭트 시나리오에서 다른 사용자가 정의를 변경하지 않았 음을 확인해야합니다. 이 경우 메시지를 표시하고 조치를 취해야합니다.

내 질문은 여기 있습니다. 무엇보다 가장 좋은 방법은 전체 정의에서 한 측면이 변경되었는지 확인하는 것입니다. 첫 번째 시도는 탭에 해당하는 모든 개체를 포함하는 집계 개체를 만들고 데이터베이스 또는 각 개체를 쿼리하여 차이점을 확인하는 것이 었습니다. 더 빠르고 더 좋은 방법이 있습니까?

답변

2

각 테이블에 버전 열을 추가하고 행을 업데이트 할 때마다이 버전을 증가시킬 수 있습니다. 탭에로드 된 개체의 버전이 데이터베이스의 버전과 일치하지 않으면 다른 사용자가 데이터를 업데이트했습니다. 그것이 JPA의 낙관적 인 잠금 기능입니다.

+0

그래, 난이 방법을 konw하지만 내 경우 작동하지 않습니다하지만 다. 일부 사용자의 변경 사항이 정의의 결과 (즉, "실행"결과)에 영향을주지 않는 경우가 있습니다. 이 방법을 사용하면 효과가 없습니다. – sebi

+0

그런 다음이 경우 버전을 증가시키지 말고, 정의의 일부가 아니기 때문에이 속성을 다른 위치에 저장하십시오. –

0

일종의 엔티티 버전 ​​관리로 수행 할 수 있으며 각 엔티티는 속성 중 하나가 수정 (설정) 될 때 true로 설정할 수있는 IsModified 속성을 가질 수 있습니다. 마지막 엔 저장 여부를 결정하기 위해 각 엔티티에서이 등록 정보를 확인하십시오.

이 경우 데이터베이스와 비교할 필요가 없습니다. 닷넷 DataTables에서

의 행 isModified, isNew 같은 행 버전 뭔가를 유지 행 버전,

+0

나는 이것에 대해 생각했지만 신속하게 옵션을 버렸다. 이 속성을 읽는 함수는 값을 읽은 후 값을 false로 설정해야합니다. 이것은 그리 안전하지 않습니다. 값을 두 번 읽거나 세 명 이상의 사용자가있는 동시성 시나리오를 읽는 것을 고려하십시오. 하나는 정의를 수정하고 다른 하나는 상태를 읽는 것입니다. – sebi

관련 문제