2012-06-20 2 views
2

이것은 해결하기를 희망하는 긴 질문과 이상한 문제입니다. 내 클라이언트가 내 서버에 JSON 개체를 게시합니다. 보고서를 저장하고 내 jms에서 다른 목적으로 생성 된 ID를 사용하지만 가끔 내 ID가 성공적으로 추가되면 null ID를 얻습니다. 이 문제를 어떻게 방지 할 수 있습니까? 내 컨트롤러에서 내 도메인Grails 엔티티 ID 삽입 후

int id 
String reportImage 
Date reportDateTime; 
static constraints = { 
    id(blank:false, unique:true) 
    reportImage (blank:true, nullable:true) 
    reportDateTime (blank:false) 
} 
def afterInsert = { 

    id= this.id 

} 

에서

, 나는

내 추가 보고서 서비스에서
JSONObject json = request.JSON   
AddReportService svc = new AddReportService()   
def id= svc.addReport(json) 
json.put("id",id) 
jmsService.send(queue:'msg.new', json.toString()) 

, 내 JMS에서

JSONObject obj = report 
Reports reports = new Reports() 
     ... 
reports.save(flush:true) 
myid = reports.id 
return myid 

을 가지고

def jmsService 
static transactional = false 
static exposes = ['jms'] 


@Queue(name='msg.new')  
def createMessage(msg) { 
    JSONObject json = new JSONObject(msg) 
    int id = json.get("id") // sometimes is null, but report was added. How to prevent? 


    AlertManagement am = new AlertManagement() 
    am.IsToSendAlert(id) 

답변

4

삽입 후 ID가 null이면 거의 확실하게 삽입이 실패한 것입니다. reports.save()으로 전화 할 때는 failOnError: true을 추가하거나 반환 값을 검사해야합니다. 코드에

몇 가지 코멘트 :

  • 당신이 도메인 객체에 ID 속성을 선언 할 필요가 없습니다, Grails는 (유형 long의) 암시 적 하나를 추가합니다.
  • 마찬가지로 id 제약 조건은 중복됩니다.
  • afterInsert 처리기에 id = this.id을 할당하면 아무 작업도 수행되지 않으므로 불필요합니다. GORM은 삽입 후에 도메인 객체 ID가 올바르게 설정되었는지 확인합니다.

또한 grails에서 객체가 유지되는 방법과시기가 항상 수월하지는 않습니다. 특히 수동 플러시 및 트랜잭션을 추가하는 경우 특히 그렇습니다. 더 나은 이해를 얻으려면 반드시 읽어야합니다. http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/

0

id 속성을 덮어 쓰려고합니다. 일반적으로 Groovy 도메인 클래스에는 기본 id 속성이 있습니다. id 속성을 정의 할 필요가 없습니다. 도메인 클래스에서 정의하지 않고 id 속성에 액세스 할 수 있습니다.

도메인 클래스

서비스 클래스에서
class A { 
    String reportImage 
    Date reportDateTime 

} 

def instance=new A("xxx",new Date()) 
if(instance.save()) 
{ 
    return instance.id 
}