2012-11-27 2 views
0

현재 버전 필드가있는 엔티티 매핑을 만드는 데 흥미가 있습니다. 그러나 웹 환경에서 버전 관리 작업 방법에 대해 혼란스러워합니다. 대부분의 예제에서 엔티티는 즉시 사용되는 구문을 사용하여 업데이트됩니다.NHibernate 버전 관리

웹 예에서 엔티티는 HTTP GET에서 가져오고 클라이언트가 HTTP POST를 호출 할 때까지 업데이트되지 않습니다. 게시물에서 일반적으로 수행하는 작업은 엔티티를 다시 가져 와서 데이터를 업데이트하고 저장하는 것입니다. 하지만 그 엔티티 내 GET과 POST 사이에 시간이 변경되었을 수 있습니다. 내가 저장하기 전에 버전 필드를 직접 확인해야합니까? 아니면 더 좋은 방법이 있습니까?

답변

2

예, 직접 확인해야합니다. 이 작업을 수행하는 한 가지 방법은 초기 get에서 엔터티를 검색하여 호출자에게 다시 보내고 응답에 버전 번호를 포함시키는 것입니다. 게시물을 게시 할 때 버전 번호를 포함 시키십시오. 서버 쪽에서, 연결된 nHibernate 엔티티를 다시 읽을 때 현재 버전 번호를 가져옵니다. 버전 번호가 오래된 경우 업데이트를 중지하십시오.

+0

사용자에게 변경된 내용을 전달하고 변경 내용을 병합하는 수단을 제공해야하므로 병행 성 검사가 어려워지는 지점입니다. –

2

버전 1)을 수동으로 확인하거나 2) DB에서 버전 관리 기능 및 타임 스탬프 유형으로 빌드 된 NHibernate를 사용합니다. (SQL Server는이를 지원합니다.하지만 대부분의 경우 다른 DB도 마찬가지입니다). 두 번째 경우에는 exception을 처리해야합니다.

병행하면 버전 매핑 열

CREATE TABLE [dbo].[MyTable](
... 
[Version] [rowversion] NOT NULL -- new keyword for deprecated [timestamp] 
... 

그런 조정을 만들 수 있습니다 당신은 SQL 서버로 작업하는 경우에는

NHibernate에 http://ayende.com/blog/3946/nhibernate-mapping-concurrency에서 처리 할 수있는 방법에 대한 자세한 설명이 있습니다 :

<version name="Version" generated="always" unsaved-value="null" type="BinaryBlob"> 
    <column name="Version" not-null="false" sql-type="timestamp" /> 
</version> 

그리고 버전을 넘겨 야합니다. ient 및 POST에 바인딩합니다 (예 :

) base64대로, NHibernate에이 NHibernate.StaleObjectStateException 던질 것이다 DB에 다음 이전 버전의 값이 session.Update(entity)에 노력할 것입니다 때마다. 이 경우에만 처리 ​​할 수 ​​있습니다. 버전이 일치하면 모두 올바르게 작동하고 UPDATE 문이 성공합니다.