2013-05-21 2 views
0

mongoDB grails 플러그인을 사용하여 내 도메인 클래스를 MongoDB에 넣으려고합니다. 클래스 중 일부는 MySQL에 있습니다. 모든 것은 도메인 클래스 인스턴스를 MongoDB에 저장하는 것조차도 잘 동작합니다 (예를 들어, 컨트롤러 코드에서 작동). 그러나 특정 not-mongoDB 클래스의 afterUpdate()에서 인스턴스를 저장하려고하면 작동하지 않습니다. 그것은 ... 예외 또는 무엇이든을 포기하지 않는 Grails MongoDB가 afterUpdate에 저장하지 않습니다.

내되지-MongoDB의 도메인 클래스 :

class CarState extends AbstractCarState { 

    ... 

    def afterUpdate() { 
     def logItemInstance = new CarStateLogItem(this.properties) 
     logItemInstance.save(failOnError: true) 
    } 
} 

MongoDB의 도메인 클래스 :

class CarStateLogItem extends AbstractCarState { 
    ObjectId id 

    static mapWith = "mongo" 

    ... 
} 

이상한 일입니다 내가 실행하는 경우 컨트롤러의 afterUpdate() 코드는 MongoDB에 저장됩니다. 뭔가 빠졌나? 또는 인스턴스를 저장할 수없는 이유는 무엇입니까? 어떤 조언을

감사합니다, 마테오

답변

1

난 당신이 MongoDB를에 저장하기 위해 새로운 transaction을 시작할 필요가 있다고 생각합니다. 알림을 받으면 CarState에 대한 거래는 MySQL이됩니다. afterUpdate 이벤트에서 mongodb으로 거래하려면 새로운 mongodb 트랜잭션이 있어야합니다. 이 시도.

def afterUpdate() { 
    CarStateLogItem.withTransaction{status -> 
     def logItemInstance = new CarStateLogItem(this.properties) 
     logItemInstance.save(failOnError: true) 
    } 
} 
+0

이 작품! 나는 CarStateLogItem.withNewSession을 시도하고 있었지만 이것이 절전 세션과 관련되어 있기 때문에 분명히 작동하지 않았다. 내가 이해하지 못하는 것은 Spring Transaction 지식이 부족하여 컨트롤러에서 작동하는 이유입니다. MySQL에 대한 연관성을 가진 현재 트랜잭션이 수행되는 트랜잭션 (즉, 트랜잭션이 true 인 서비스 = true)은 맞습니까? – kuceram

+0

서비스 계층의 트랜잭션은 연관된 '데이터 소스'와 결합됩니다. 나는 당신이 mongodb가 아닌 MySQL 데이터 소스를 가질 것이라고 확신한다. – dmahapatro

관련 문제