문제

나는 작은 Grails 앱을 작성하고 있으며 다음과 같은 간단한 코드를 실행할 때 "CreateFoo"에 대한 통화 중 약 1/10에 대한 staleobjectStateException : S를 계속 얻습니다. 아마도 아마도 나는 Gorm을 사용하는 가장 좋은 방법을 놓치고있을 것입니다.

이것은 코드입니다.

def viewfoo = {
  session.user.refresh()
  // ...
}

def createfoo = {
  session.user.refresh()
  var user = session.user
  if (param["name"]) {
    var newFoo = new Foo()
    newFoo.name = param["name"]
    if (newFoo.validate()) {
      newFoo.save()
      if (user.validate()) {
        user.addToFoos(newFoo)
      } else {
        user.discard()
      }
    } else {
      newFoo.discard()
    }
  }
}

GORM 모범 사례에 관한 나의 질문 :

  1. "if-validate ()-save ()-else-discard ()"가 Gorm에서 새로운 대상을 지속하는 올바른 방법은 무엇입니까?

  2. ()을 저장하려는 모든 객체를 검증해야합니까? 즉, 위 코드에서 foo-object와 user-opject를 모두 검증해야합니까? FOO-Object의 상태를 암시 적으로 검사 할 수 있습니까?

  3. staleobjectStateException을받을 자격이있는 것은 무엇입니까? :-)

Gorm/Hibernate 예외 :

Caused by: Object of class [Foo] with identifier [15]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [Foo#15]
도움이 되었습니까?

해결책

왜 당신이 문제를 일으키고 있는지 확실하지 않지만 병합 도메인 개체의 메소드. 현재 객체를 현재 영구 컨텍스트로 다시 재구성 할 수 있습니다.

나는 당신의 foo 또는 사용자 객체에 대해 어떤 사용자 정의를한지에 대해 충분히 알지 못하거나 이것을 재현하기 위해 사용하고있는 Grails/Java 버전에 대해 충분히 알지 못합니다.

데이터베이스 버전이 업데이트되고 (따라서 동기화되지 않음) 사용자 객체에서 수행하는 새로 고침과 관련이 있다고 생각하지만 확실하지 않습니다.

또한, 나는 검증 된 행동이 변하는 행동이 바뀌고 있으며 Grails 1.1에서 덜 필요하다고 생각합니다. 이 게시물

다른 팁

내가 알아 차린 한 가지는 당신이 단지 foo를 추가하더라도 사용자를 저장하지 않는다는 것입니다. 실제로 저장 사용자는 FOO를 저장해야 할 필요성을 제거해야합니다.

사용자를 검증 할 필요가 없습니다. 신뢰할 수없는 소스에 의해 속성이 변경되지 않으며 저장할 때마다 데이터베이스 수준의 제약 조건을 확인합니다.

마지막으로, user.refresh ()와 같은 것들이 동작 외부와 인터셉터 또는 필터로 더 잘 옮겨집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top