2013-10-21 3 views
0

저장 OptimisticLockingException 동안 얻을 URL을 기반으로하지만 저장 프로세스 중에 오류가 발생합니다.Grails의 그롬 + MongoDB를 내가 MongoDB를에서 개체를 저장 Grails의에 서비스하려고

Could not commit Datastore transaction; nested exception is org.grails.datastore.mapping.core.OptimisticLockingException: The instance was updated by another user while you were editing

하지만 setter를 사용하지 않고 그냥 모두 전달합니다. 생성자의 값,이 예외는 사라졌습니다. 왜?

답변

2

여기 documentation에보고 :

Note that if you manually assign an identifier, then you will need to use the insert method instead of the save method, otherwise GORM can't work out whether you are trying to achieve an insert or an update

그래서 당신은 당신이이 같은 매핑을 정의하지 않을 경우 삽입 방법을 사용하는 대신 ID 발생기

cover.insert(failOnError: true) 

을 할당 될 때 저장해야합니다 :

static mapping = { 
    id generator: 'assigned' 
} 

삽입 방법을 사용하면 자동 생성 된 objectId :

"_id" : "5496e904e4b03b155725ebdb" 
1

이 예외는 새 모델에 id를 할당하고 GORM이 업데이트를 수행해야한다고 생각하기 때문에이 모델을 저장하려고 할 때 발생합니다. 내가 Grails의-몽고 플러그인 1.3.0 사용 된이 문제에 실행하면이 예외가

발생하는 이유

. Grails 데이터 저장소 코어 코드 1.1.9를 사용합니다. 예외가 라인 847(ish) of NativeEntryEntityPersister에 생성 된 것으로 나타났습니다. 이 코드는 db의 기존 도메인 객체를 업데이트합니다.

Above that on line 790은 업데이트인지 확인하는 데 사용되는 isUpdate입니다. isInsert은 이 객체에 할당 된 ID를 반환하므로 isUpdate이 true로 평가 될 수 있으므로 true 인 경우에만 이므로 false이므로 그대로 사용하십시오. 당신이 삽입 코드가 호출되는 것이다 인서트를 강제 과연 예외가 사라집니다 경우

라인 (791)에 && !isInsert에 예외를

감사 고정. 그러나이 작업을 수행하면 할당 된 ID가 저장되지 않고 대신 생성 된 개체 ID가 사용되었습니다. 나는이 문제가 발전기가 "assigned"으로 설정되어 있는지 확인하기 위해 line 803에있는 것을 보았다.

다음 매핑을 추가 할 수 있도록 수정하십시오.

class Cover { 
    String id 
    String name 
    String url 
    String sku 
    String price 
    static mapping = { 
     id generator: 'assigned' 
    } 
} 

부작용은 새 Cover 도메인 개체에 항상 ID를 할당해야한다는 것입니다.

+0

나는 GORM이 왜 그렇게 생각하는지 이해하지 못합니다. 설명해 주시겠습니까? – sphinks

+0

곰이 왜 이것을 생각하는지에 대한 자세한 내용으로 질문을 업데이트했습니다. – PaddyDwyer